Ruby:为什么在对象上调用超类方法会产生错误

时间:2013-07-22 01:10:08

标签: ruby

  

A是类B的子类。类B是类C的子类。 a是类A的对象。 b是类B的对象。以下哪一个Ruby表达式不正确?

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

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

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

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

但是当我将A.superclass == B输入irb时,我得到true

为什么我可以在类上调用superclass而不在类的对象上调用它?

1 个答案:

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