Ответ 1
Может быть подключен к тип данных C RUBY_T_DATA. Каким может быть способ хранения данных C через API C в Ruby VM.
Сегодня я случайно обнаружил таинственный класс Data в Ruby, и я не могу найти какую-либо полезную информацию о том, что он делает, или почему он там. Я предполагаю, что это часть самой реализации языка.
Кто-нибудь знает, что он делает?
mbp-scott:~ scott$ irb
ruby-1.9.3-p0 :001 > Data
=> Data
ruby-1.9.3-p0 :002 > Data.is_a? Module
=> true
ruby-1.9.3-p0 :003 > Data.is_a? Class
=> true
ruby-1.9.3-p0 :004 > Data.ancestors
=> [Data, Object, Kernel, BasicObject]
ruby-1.9.3-p0 :005 > Data.methods
=> [:allocate, :new, :superclass, :freeze, :===, :==, :<=>, :<, :<=, :>,
:>=, :to_s,:included_modules, :include?, :name, :ancestors, :instance_methods,
:public_instance_methods, :protected_instance_methods, :private_instance_methods,
:constants, :const_get, :const_set, :const_defined?, :const_missing, :class_variables,
:remove_class_variable, :class_variable_get, :class_variable_set,
:class_variable_defined?, :public_constant, :private_constant, :module_exec,
:class_exec, :module_eval, :class_eval, :method_defined?, :public_method_defined?,
:private_method_defined?, :protected_method_defined?, :public_class_method
:private_class_method, :autoload, :autoload?, :instance_method, :public_instance_method,
:nil?, :=~, :!~, :eql?, :hash, :class, :singleton_class, :clone, :dup, :initialize_dup,
:initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :frozen?,
:inspect, :methods, :singleton_methods, :protected_methods, :private_methods,
:public_methods, :instance_variables, :instance_variable_get, :instance_variable_set,
:instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send,
:public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method,
:public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :equal?,
:!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
ruby-1.9.3-p0 :006 > Data.instance_variables
=> []
ruby-1.9.3-p0 :007 > self
=> main
Может быть подключен к тип данных C RUBY_T_DATA. Каким может быть способ хранения данных C через API C в Ruby VM.
Несколько сведений из документации C-API:
Он определяется на object.c
. marshal.c
использует его как временный внутренний тип контейнера здесь, здесь и здесь. stringio.c
используется в качестве суперкласса StringIO
. error.c
используется в качестве суперкласса NameError::message
(кажется, недоступен с рубиновой стороны, так как не начинается с прописной буквы). Является суперклассом Iconv
в iconv.c
.
Это конкретная реализация и не должна быть общедоступной. Просто не используйте его.
Справедливости ради:
(main)> Class.is_a? Module
=> true
Для того, что я вижу, вы не можете сделать экземпляр, чтобы вы не использовали его как чистую комнату (о которой я думал сначала).
Здесь больше из object.c, где документы указывают, что он определен. Кажется, что он имеет то же происхождение, что и TrueClass и NilClass (чтобы назвать только те)
rb_define_class("Data", rb_cObject)
rb_undef_alloc_func(rb_cData);
rb_define_class("TrueClass", rb_cObject)
rb_define_class("NilClass", rb_cObject)
Какова бы ни была цель этого класса, у него нет собственных методов, и вы не можете создать его экземпляр. Лично я бы потратил свои деньги на бесполезные на данный момент, возможно, в будущем есть планы для этого класса, поэтому зарезервировано имя const Data.
Изменить: есть еще... Поиск rb_cData в кодовой базе показал примеры использования.
require 'stringio'
StringIO.ancestors
=> [StringIO, Enumerable, Data, Object, PP::ObjectMixin, Kernel, BasicObject]
Он также появляется в curses, socket, tk, iconv и в win32ole. В основном используется внутри с Data_Wrap_Struct и для определения базового класса.