класс Class
Расширяет любой класс, чтобы включать метод json_creatable?.
Классы в Ruby — это объекты первого класса — каждый из них является экземпляром класса Class.
Обычно вы создаете новый класс, используя:
class Name # some code describing the class behavior end
Когда создается новый класс, инициализируется объект типа Класс и присваивается глобальной константе (Name в данном случае).
Когда Name.new вызывается для создания нового объекта, метод new в Class выполняется по умолчанию. Это можно продемонстрировать, переопределив new в Class:
class Class
alias old_new new
def new(*args)
print "Creating a new ", self.name, "\n"
old_new(*args)
end
end
class Name
end
n = Name.new
выводит:
Creating a new Name
Классы, модули и объекты взаимосвязаны. На диаграмме ниже вертикальные стрелки представляют наследование, а скобки — метаклассы. Все метаклассы являются экземплярами класса `Class`.
+---------+ +-...
| | |
BasicObject-----|-->(BasicObject)-------|-...
^ | ^ |
| | | |
Object---------|----->(Object)---------|-...
^ | ^ |
| | | |
+-------+ | +--------+ |
| | | | | |
| Module-|---------|--->(Module)-|-...
| ^ | | ^ |
| | | | | |
| Class-|---------|---->(Class)-|-...
| ^ | | ^ |
| +---+ | +----+
| |
obj--->OtherClass---------->(OtherClass)-----------... Публичные методы класса
static VALUE
rb_class_initialize(int argc, VALUE *argv, VALUE klass)
{
VALUE super;
if (RCLASS_SUPER(klass) != 0 || klass == rb_cBasicObject) {
rb_raise(rb_eTypeError, "already initialized class");
}
if (argc == 0) {
super = rb_cObject;
}
else {
rb_scan_args(argc, argv, "01", &super);
rb_check_inheritable(super);
if (super != rb_cBasicObject && !RCLASS_SUPER(super)) {
rb_raise(rb_eTypeError, "can't inherit uninitialized class");
}
}
RCLASS_SET_SUPER(klass, super);
rb_make_metaclass(klass, RBASIC(super)->klass);
rb_class_inherited(super, klass);
rb_mod_initialize(klass);
return klass;
} Создает новый анонимный (без имени) класс с указанным суперклассом (или Object, если параметр не задан). Вы можете присвоить классу имя, присвоив объект класса константе.
Если блок задан, он передается объекту класса, и блок оценивается в контексте этого класса, как и class_eval.
fred = Class.new do
def meth1
"hello"
end
def meth2
"bye"
end
end
a = fred.new #=> #<#<Class:0x100381890>:0x100376b98>
a.meth1 #=> "hello"
a.meth2 #=> "bye"
Присвойте класс константе (название, начинающееся с заглавной буквы), если хотите обращаться с ним как с обычным классом.
Публичные методы экземпляра
VALUE
rb_obj_alloc(VALUE klass)
{
VALUE obj;
rb_alloc_func_t allocator;
if (RCLASS_SUPER(klass) == 0 && klass != rb_cBasicObject) {
rb_raise(rb_eTypeError, "can't instantiate uninitialized class");
}
if (FL_TEST(klass, FL_SINGLETON)) {
rb_raise(rb_eTypeError, "can't create instance of singleton class");
}
allocator = rb_get_alloc_func(klass);
if (!allocator) {
rb_undefined_alloc(klass);
}
RUBY_DTRACE_CREATE_HOOK(OBJECT, rb_class2name(klass));
obj = (*allocator)(klass);
if (rb_obj_class(obj) != rb_class_real(klass)) {
rb_raise(rb_eTypeError, "wrong instance allocation");
}
return obj;
} Выделяет место для нового объекта класса class и не вызывает initialize для нового экземпляра. Возвращаемый объект должен быть экземпляром class.
klass = Class.new do
def initialize(*args)
@initialized = true
end
def initialized?
@initialized || false
end
end
klass.allocate.initialized? #=> false
# File ext/json/lib/json/common.rb, line 453 def json_creatable? respond_to?(:json_create) end
Возвращает true, если этот класс может быть использован для создания экземпляра из сериализованной строки JSON. Класс должен реализовывать метод класса json_create, который принимает хеш в качестве первого параметра. Хеш должен содержать необходимые данные.
VALUE
rb_class_new_instance(int argc, const VALUE *argv, VALUE klass)
{
VALUE obj;
obj = rb_obj_alloc(klass);
rb_obj_call_init(obj, argc, argv);
return obj;
} Вызывает allocate для создания нового объекта класса class, затем вызывает метод initialize этого объекта, передавая ему args. Это метод, который в конечном итоге вызывается при создании объекта с помощью .new.
VALUE
rb_class_superclass(VALUE klass)
{
VALUE super = RCLASS_SUPER(klass);
if (!super) {
if (klass == rb_cBasicObject) return Qnil;
rb_raise(rb_eTypeError, "uninitialized class");
}
while (RB_TYPE_P(super, T_ICLASS)) {
super = RCLASS_SUPER(super);
}
if (!super) {
return Qnil;
}
return super;
} Возвращает суперкласс class или nil.
File.superclass #=> IO IO.superclass #=> Object Object.superclass #=> BasicObject class Foo; end class Bar < Foo; end Bar.superclass #=> Foo
Возвращает nil, когда у данного класса нет родительского класса:
BasicObject.superclass #=> nil
Приватные методы экземпляра
static VALUE
rb_obj_dummy(void)
{
return Qnil;
} Обратный вызов, вызываемый всякий раз, когда создается подкласс текущего класса.
Пример:
class Foo
def self.inherited(subclass)
puts "New subclass: #{subclass}"
end
end
class Bar < Foo
end
class Baz < Bar
end
выводит:
New subclass: Bar New subclass: Baz
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.