与类定义中的`include`混淆

时间:2013-02-25 11:11:28

标签: ruby

在下面的代码中,我不明白为什么类会返回它们的名字。

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.newToo.new上创建任何对象。是否在类定义中创建了这样的对象?

2 个答案:

答案 0 :(得分: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

您尚未创建FooToo的任何实例。您看到的对象ID是类FooToo的对象ID。

答案 1 :(得分:1)

在您的第一个代码示例中,类未返回其名称。他们正在返回这些类本身,其中irb呈现为类名。

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