Ruby模块包括

Ruby模块包括,ruby,module,Ruby,Module,如果我有一个类和一个模块: class Foo end module WhackyFoo def whacky puts 'shits whacky!' end end 为什么我可以这样做: include WhackyFoo Foo.new.whacky # => shits whacky! 有人能解释一下或者给我指一下Ruby文档吗?因为当您在顶层包含模块时,它会被包含到一个特殊的对象main中。在main上定义的任何方法(包括模块中包含的方法)都将成为对象的私有

如果我有一个类和一个模块:

class Foo
end

module WhackyFoo
  def whacky
    puts 'shits whacky!'
  end
end
为什么我可以这样做:

include WhackyFoo
Foo.new.whacky
# => shits whacky!

有人能解释一下或者给我指一下Ruby文档吗?

因为当您在顶层包含模块时,它会被包含到一个特殊的对象
main
中。在
main
上定义的任何方法(包括模块中包含的方法)都将成为
对象的私有实例方法(因此,所有对象都是如此)。这就是它起作用的原因

如果将模块包括到“普通”类中(而不是顶级
main
),则其行为与您预期的一样

module WhackyFoo
  def whacky
    puts 'shits whacky!'
  end
end

class Foo
end

class Bar
  include WhackyFoo
end


Bar.new.whacky # >> "shits whacky!"

Foo.new.whacky # ~> -:16:in `<main>': undefined method `whacky' for #<Foo:0x007fa92984d968> (NoMethodError)
modulewhackyfoo
def古怪
把“屎搞得乱七八糟!”
结束
结束
福班
结束
分类栏
包括古怪的东西
结束
Bar.new.whacky#>>“他妈的疯了!”
Foo.new.whacky#~>-:16:in``:for#的未定义方法'whacky'(NoMethodError)

因为当您在顶层包含模块时,它会被包含到一个特殊的对象
main
。在
main
上定义的任何方法(包括模块中包含的方法)都将成为
对象的私有实例方法(因此,所有对象都是如此)。这就是它起作用的原因

如果将模块包括到“普通”类中(而不是顶级
main
),则其行为与您预期的一样

module WhackyFoo
  def whacky
    puts 'shits whacky!'
  end
end

class Foo
end

class Bar
  include WhackyFoo
end


Bar.new.whacky # >> "shits whacky!"

Foo.new.whacky # ~> -:16:in `<main>': undefined method `whacky' for #<Foo:0x007fa92984d968> (NoMethodError)
modulewhackyfoo
def古怪
把“屎搞得乱七八糟!”
结束
结束
福班
结束
分类栏
包括古怪的东西
结束
Bar.new.whacky#>>“他妈的疯了!”
Foo.new.whacky#~>-:16:in``:for#的未定义方法'whacky'(NoMethodError)

include
最终在对象上被调用,这就是ruby中的一切。由于每个类都继承自对象,因此您在模块中定义的方法最终将包含在每个类中。

包含的
最终会被对象调用,这就是ruby中的所有内容。由于每个类都继承自对象,因此您在模块中定义的方法最终将包含在每个类中。

因此,该方法无处不在。如果我想把它包含到Foo中,我想我必须给它命名名称。@Billy:你必须把它包含到Foo中。所以这个方法无处不在。如果我想将它包含在Foo中,我想我必须给它命名名称。@Billy:你必须将它包含在Foo中。