我已经阅读了很多关于ruby类和对象的内容,我得出了这个结论
有一个名为“class”的概念,我们有以下类:
BasicObject
是
的超类Object
是
的超类Module
是
的超类Class
这样:
“class”Class
是“class”的子类Object
因为以上所有“类,模块,对象,基本对象”都是“类”概念的实例。 Instance_of? Class
会
对所有人都返回
(Object.new).instance_of? Class
将返回false,因为(Object.new)
是“class”的实例Object
的问题:
Class.is_a? Object
是正确的,因为Class
是Object
的子类,但Object.is_a? Class
也返回true,因为Class在这里指的是更大的类概念吗?如果是这样的话?是不是很混乱?我怎么知道哪个班级是哪个?答案 0 :(得分:1)
你有几件事情错了。
Class
,Module
,Object
和Basic Object
是Class
的实例,不是因为Class < Module < Object < BasicObject
。它与它无关。(Object.new).instance_of? Class
不返回false
,因为Object.new
是Object
的实例。这是因为它不是Class
的实例。Class.is_a? Object
true
不是因为[提到的] Class
是Object
的子类。这是因为(提到的)Class
是Class
的实例(未提及),它是Object
的子类。问题的答案是:Object.is_a? Class
返回true
,因为Object
是Class
的实例。
如果您想了解实例的类,请使用instance_of?
或class
方法。
3.is_a?(Object) # => false
3.is_a?(Fixnum) # => true
3.class # => Fixnum
答案 1 :(得分:-1)
真正意义上的是Ruby在作弊。 Matz想要在设计Ruby时复制smalltalk的优雅,即规则
一切都是对象。
更具技术性
所有内容都是
Object
类或其子类之一的实例。
但是,正如您所见,这条简单的规则会导致一些令人困惑的情况。所有这些疯狂如何运作?就像我说的,它作弊。 Ruby解释器被硬编码以欺骗某些关系,因此“一切都是对象的黄金法则”#34; 看起来就像它没有破坏一样。这里直接来源:
void Init_class_hierarchy(void)
{
/* the normal hierarchy we know and love */
rb_cBasicObject = boot_defclass("BasicObject", 0);
rb_cObject = boot_defclass("Object", rb_cBasicObject);
rb_cModule = boot_defclass("Module", rb_cObject);
rb_cClass = boot_defclass("Class", rb_cModule);
/* sneaky stuff to force consistent behavior!!! */
rb_const_set(rb_cObject, rb_intern_const("BasicObject"), rb_cBasicObject);
RBASIC_SET_CLASS(rb_cClass, rb_cClass);
RBASIC_SET_CLASS(rb_cModule, rb_cClass);
RBASIC_SET_CLASS(rb_cObject, rb_cClass);
RBASIC_SET_CLASS(rb_cBasicObject, rb_cClass);
}
在源代码中还有很多案例,其中内置类需要特殊处理,以便给出最不令人惊讶的&#34;结果。基本上,当涉及抽象这样的内部事物时,不要担心它。假设事情会按预期运作。