如果我有一類和模塊:紅寶石模塊包括
class Foo
end
module WhackyFoo
def whacky
puts 'shits whacky!'
end
end
我爲什麼可以這樣做:
include WhackyFoo
Foo.new.whacky
# => shits whacky!
有人可以解釋或點我到這種用法說明了Ruby的文檔?
如果我有一類和模塊:紅寶石模塊包括
class Foo
end
module WhackyFoo
def whacky
puts 'shits whacky!'
end
end
我爲什麼可以這樣做:
include WhackyFoo
Foo.new.whacky
# => shits whacky!
有人可以解釋或點我到這種用法說明了Ruby的文檔?
因爲當您將模塊包含在頂層時,它將被包含到一個特殊對象main
中。在main
上定義的任何方法(包括從模塊包含的那些方法)都成爲Object
(以及因此所有對象)的私有實例方法。這就是它工作的原因。
如果你有一個模塊插入一個「正常」類(非頂級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)
的include
最終被呼籲的對象,這就是一切紅寶石歸結爲。由於每個類都從Object繼承,所以在模塊中定義的方法將最終包含在每個類中。
awww打敗我吧D: –
所以這種方法無處不在。如果我想將它包含到Foo中,我想我必須命名空間。 – Billy
@比利:你必須將它包含在Foo中。 –