为什么“包含”在全局上下文中的行为与在类中的行为不同?

时间:2013-10-18 18:32:20

标签: ruby

在全局上下文(main)中,当您包含模块时,可以直接从全局上下文中使用其方法。在一个类中,包括模块定义的实例方法无法从包含的相同上下文中调用。这是为什么?

示例:

module Foo
  def hello
    puts "Hello, world!"
  end
end

# In a class:
class Bar
  include Foo
  hello # Hello is an instance method so it won't work here.
end

# In main
include Foo
hello # Works fine. Why?

1 个答案:

答案 0 :(得分:1)

  

主要

     

包括Foo

     

你好#工作正常。为什么呢?

What is the Ruby Top-Level?一个关于这个概念的好博客,你必须先行。

因为在顶级,你在顶级对象#hello上调用实例方法main,这是Object类的一个实例。在顶级你正在做{{1表示您将模块包含在include Foo类中。这就是模块Object的实例方法#hello成为类Foo的实例方法的原因。

object

如果您将方法调用为module Foo def hello puts "Hello, world!" end end Object.include?(Foo) # => false include Foo Object.include?(Foo) # => true self # => main self.class # => Object self.instance_of? Object # => true hello # => Hello, world! ,则在顶层,但ruby正在内部执行helloself.helloself,我之前已解释过。