类
A
是类B
的子类。类B
是类C
的子类。a
是类A
的对象。b
是类B
的对象。以下哪一个Ruby表达式不正确?
b.respond_to?('class')
a.superclass == b.class
A.superclass == B
- 醇>
a.class.ancestors.include?(C)
这个测验问题的答案是(2)。
我理解为什么(1),(3)和(4)是正确的,但(2)有点令人困惑。
(2)令人困惑,因为当我将a.superclass
输入irb
时,我得到NoMethodError: undefined method 'superclass' for #<A:0x7fbdce1075f0>
。
但是当我将A.superclass == B
输入irb
时,我得到true
。
为什么我可以在类上调用superclass
而不在类的对象上调用它?
答案 0 :(得分:8)
class C
end
class B < C
end
class A < B
end
a = A.new
b = B.new
p b.class
p a.superclass
--output:--
B
1.rb:14:in `<main>': undefined method `superclass' for #<A:0x0000010109bc88> (NoMethodError)
为什么我可以在类上调用超类而不在类的对象上调用?
首先,正确的术语是“A的实例”。你可以在A上调用superclass()的原因是因为ruby定义了一个名为Class的类,而Class定义了可以由类对象调用的方法,类对象是Class的实例。所有课程,例如A,是Class的实例。 Class中定义的方法之一是superclass()。
另一方面,A的实例不是类,因此A的实例不能调用Class中定义的方法。
你可能已经读过“ruby中的所有东西都是一个对象”(这不是真的,但在大多数情况下都是如此)。所以A是一个对象(除了是一个类)。对象必须是某个类的实例,并且恰好A是Class的实例。因此,A可以调用Class。中定义的方法。