2

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

例子:

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?
4

1 回答 1

1

在主要

包括 Foo

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

什么是 Ruby 顶级?一个关于这个概念的好博客,你必须先通读一遍。

因为在顶层你正在调用#hello顶层对象上的实例方法main,这是一个类的实例。Object在顶层你正在做include Foo的意味着你将模块包含在类中。这就是模块的实例Object方法成为实例的原因类的方法。#helloFooobject

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!

如果您将方法称为 as ,则在顶层hello,但 ruby​​ 在内部执行 as self.hello。在self那里main,我之前解释过。

于 2013-10-18T18:33:59.930 回答