2013-07-22 27 views
1

A是類B的子類。類B是類C的子類。 a是類A的一個對象。 b是類B的一個對象。下列哪個Ruby表達式不正確?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而不是在類的對象上?

回答

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對象(它們是Class的實例)調用的方法。所有課程,例如A是Class的實例。在Class中定義的方法之一是superclass()。

另一方面,A的實例不是類,因此A的實例無法調用Class中定義的方法。

你可能已經讀過「ruby中的所有東西都是對象」(這是不正確的,但在大多數情況下是這樣)。所以A是一個對象(除了是一個類)。一個對象必須是某個類的一個實例,並且碰巧A是一個Class的實例。因此,A可以調用Class中定義的方法。

+1

謝謝你的解釋!測驗問題表示'a'是'A'類的_object_。這是不準確還是不準確,而'a'是'A'的_instance_會更準確嗎? – user86408

+2

短語'a是類A的對象'也是正確的,但不是'a是類對象'。我想在講述一個類的實例時,說「類的對象」在技術上是正確的,但是由於它看起來和聽起來像'類對象'一樣太混亂了。在紅寶石中,「類對象」是A或B或C. – 7stud

+0

好的,謝謝你的幫助和澄清! – user86408

相關問題