1

以下のコードでは、クラスが名前を返す理由がわかりません。

module Show
  def show_string
    p "hi"
  end
end

class Foo
  @x=12
  include Show
end
# => Foo

class Test
  include Show
end
# => Test

理由を確認するために、挿入しobject_idました。そして、オブジェクトIDが表示されるようになりました。

class Foo
  @x=12
  (include Show).object_id
end
# => 10681980

class Too
  @x=12
  (include Show).object_id.inspect
end
# => "10648020"

Foo.newとにオブジェクトを作成しませんでしたToo.new。そのようなオブジェクトは、クラス定義内に作成されていますか?

4

2 に答える 2

2

モジュール/クラスを定義すると、戻り値は本体内の最後の式になります。

module A; :foo end
# => :foo

本体が空の場合は を返しますnil

module A; end
# => nil

includeここで、の戻り値がインクルードしているモジュールであることに注意してください。mainこれは、次の環境で確認できます。

p (include A)
# => Object

したがってinclude A、 のモジュール本体内で行う場合B、戻り値は最後の式の値である必要がありinclude AますB

module B
  include A
end
# => B

Fooまたはのインスタンスを作成していませんToo。表示されているオブジェクト ID は、クラスFooとのオブジェクト ID ですToo

于 2013-02-25T11:46:59.100 に答える
1

最初のコード例では、クラスは名前を返しません。それらは、irb がクラス名としてレンダリングするクラス自体を返しています。

コードの 2 番目のブロックでは、#include の戻り値はインクルードを実行するクラスです。コードの 2 番目のブロックに表示されているオブジェクト ID は、Foo と Too のものです。それはあなたの質問に答えていますか?

于 2013-02-25T11:37:40.567 に答える