
[英]How to call an instance method defined in a module that is overwritten by another module in Ruby?
[英]ruby - how to dynamically call instance method in a module
我正在嘗試動態調用實例方法。 我發現send
, call
, eval
這樣做。 有動態調用類方法的例子,但我還沒有弄清楚如何讓它適用於實例方法。
例如
module MyModule
def Foo
puts "hello"
end
end
實例方法名稱可以列出:
MyModule.instance_methods
#=> [:Foo]
但我無法弄清楚如何調用該方法:
MyModule.send("Foo")
#=> NoMethodError: undefined method `Foo' for MyModule:Module
MyModule.method("Foo").call
#=> NameError: undefined method `Foo' for class `Module'
eval 'MyModule.Foo'
#=> NoMethodError: undefined method `Foo' for MyModule:Module
如何通過方法名稱調用實例方法,如Foo
?
免責聲明:糟糕的做法,它幾乎沒有任何意義:
MyModule.instance_method(:Foo) # #<UnboundMethod: MyModule#Foo>
.bind(Object) # #<Method: MyModule#Foo>
.call #=> hello
您無法調用未綁定的方法,因此必須先將其綁定到某個對象。
參考文獻:
如果你使用方法單例方法會容易得多:
module MyModule
def self.Foo
puts "hello"
end
end
MyModule.Foo
#=> "hello"
另一個選擇是使用module_function
(在使用此選項時讀取方法對包含對象的可見性):
module MyModule
def Foo
puts "hello"
end
module_function :Foo
end
MyModule.Foo
#=> "hello"
還有一個是使用extend self
:
module MyModule
def Foo
puts "hello"
end
extend self
end
MyModule.Foo
#=> "hello"
PS在方法名稱中使用大寫字母並不常見。 在Ruby中它是非常罕見的情況,它可以使用,你的情況是100%而不是一個:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.