1

ClassAは Class のサブクラスですB。ClassBは class のサブクラスです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) は少しわかりにくいです。

a.superclass(2) に入力するirbと が得られるため、わかりにくいですNoMethodError: undefined method 'superclass' for #<A:0x7fbdce1075f0>

しかし、 に入力A.superclass == Bするとirb、 が得られ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 で定義されているメソッドの 1 つに superclass() があります。

一方、A のインスタンスはクラスではないため、A のインスタンスは Class で定義されたメソッドを呼び出すことができません。

「Ruby ではすべてがオブジェクトである」と読んだことがあるかもしれません (これは正しくありませんが、ほとんどの場合はそうです)。したがって、A は (クラスであることに加えて) オブジェクトです。オブジェクトは何らかのクラスのインスタンスでなければならず、たまたま A がクラスのインスタンスです。したがって、A は Class で定義されたメソッドを呼び出すことができます。

于 2013-07-22T01:20:51.283 に答える