1

ClassA是 Class 的子类B。类B是类的子类Ca是类的对象Ab是类的对象B。以下哪个 Ruby 表达式不正确?

  1. b.respond_to?('class')
  2. a.superclass == b.class
  3. A.superclass == B
  4. a.class.ancestors.include?(C)

这个测验问题的答案是(2)。

我理解为什么(1)、(3)和(4)是正确的,但是(2)有点令人困惑。

(2) 令人困惑,因为当我输入 时a.superclassirb我得到了NoMethodError: undefined method 'superclass' for #<A:0x7fbdce1075f0>

但是当我输入 时A.superclass == Birb我得到true.

为什么我可以调用superclass一个类而不是类的对象?

4

1 回答 1

9
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 中定义的方法。

于 2013-07-22T01:20:51.283 回答