我已经深入了解Ruby层次结构以理解它。例如,
class Test
end
t = Test.new
所以,如果我想上课,我需要上课#39;属性:
t.class # 'Test'
如果我想获得Test class的父级,我应该使用' superclass'方法:
t.class.superclass # BasicObject
但Test也是Class类的一个实例。所以,如果我执行以下内容:
t.class.class # Class
所以,我不明白超级'之间的区别。和' class.class&#39 ;;为什么不是Test的超类?这是什么意思? Doest Test继承Class或BasicObject或两者的方法?请向我解释这个问题。我来自Java,之前我没有听说过这些功能。谢谢。
答案 0 :(得分:1)
每个对象都响应class
。它说对象是实例的对象是什么类。
只有课程才会回复superclass
。它说该类是子类的类。
Foo = Class.new # class Foo; end
foo = Foo.new
Foo.class # Class
foo.class # Foo
Bar = Class.new(Foo) # class Bar < Foo; end
Bar.class # Class
Bar.superclass # Foo
所有类都是Class的实例。 Ruby 不允许类的子类。
答案 1 :(得分:0)
首先,默认情况下,您定义的类的隐式超类是Object
,而不是BasicObject
。
现在,Test.superclass
方法返回Test
直接继承的类。虽然Test.class
返回Test
实例的类。请记住,Ruby中的类也是对象,Ruby中的所有对象都属于某个类。
答案 2 :(得分:0)
所有对象都是Object类的后代。类也是对象,它是Object的一个实例,看起来有点奇怪。
class Test
end
Test.class # => Class
Test.superclass # => Object
Object.class # => Class
Class.superclass # => Module
Module.class # => Class
Module.superclass # => Object
Object.superclass # => BasicObject
Object类的所有后代都继承了很多方法,比如clone,dup,freeze和许多其他方法。另一方面,BasicObject几乎不提供任何方法 - 它甚至不提供方法:methods和public_methods。