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.newand上创建任何对象Too.new。这些对象是否在类定义中创建?

4

2 回答 2

2

定义模块/类时,返回值是正文中的最后一个表达式:

module A; :foo end
# => :foo

当 body 为空时,它返回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 是类的对象 idFooToo.

于 2013-02-25T11:46:59.100 回答
1

在您的第一个代码示例中,类没有返回它们的名称。他们自己返回类,irb 将其呈现为类名。

对于您的第二个代码块,#include 的返回值是执行包含的类。您在第二个代码块中看到的对象 ID 是 Foo 和 Too 的 ID。这是否回答你的问题?

于 2013-02-25T11:37:40.567 回答