你也可以使用extend()來撬開對象的單例類。調用extend(module)將模塊中的方法添加到調用對象(即接收者)的單例類中。所以如果你在self = A的時候調用extend(module),也就是在A類的內部,那麼模塊的方法會被插入到A的singleton類中,而A的singleton類中的方法也被稱爲A的類方法:
class A
end
greeting = "hello"
Class.new(A) do
extend(
Module.new do
define_method(:greet) do
puts greeting
end
end
)
end.greet
--output:--
hello
而且你可以重寫,像這樣(但那就不是那麼複雜):
class A
end
greeting = "hello"
Class.new(A) do
m = Module.new do
define_method(:greet) do
puts greeting
end
end
extend(m)
end.greet
...這是不是遠遠不同:
class A
end
greeting = "hello"
m = Module.new do
define_method(:greet) do
puts greeting
end
end
Class.new(A) do
extend(m)
end.greet
...其移動關閉了cla ss,而且看起來並不複雜,因爲它只打開了兩個示波器門,而不是三個。另外請注意,extend()是一個公共方法,所以它不需要私有方法的詭計,也就是說你不能指定顯式接收方,所以你必須創建一個上下文,其中self您要調用私有方法的對象。換句話說,你可以爲extend()指定一個明確的接收者。 Class.new(A)返回的類如何?
class A
end
greeting = "hello"
Class.new(A).extend(
Module.new do
define_method(:greet) do
puts greeting
end
end
).greet
--output:--
hello
嘿,加上「.greet」那裏工作!嗯哦,那有一個襯墊的氣質:
class A
end
greeting = "hello"
Class.new(A).extend(Module.new {define_method(:greet) {puts greeting} }).greet
--output:--
hello
Yeech!
我不認爲這是馬克思的問題。他用一個字符串作爲示例,但他想要做的是將變量或方法的值合併到當前作用域中的方法中。 –