gpt4 book ai didi

ruby - 如何在模块中动态调用实例方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:44:48 26 4
gpt4 key购买 nike

我正在尝试动态调用实例方法。我发现 sendcalleval 可以做到这一点。有动态调用类方法的例子,但我还没有想出如何让它对实例方法起作用。

例如

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

您不能调用未绑定(bind)的方法,因此您必须先将其绑定(bind)到某个对象。

引用资料:


如果将方法设为单例方法会容易得多:

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"

附言在方法名称中使用大写字母是不习惯的。在 Ruby 中可以使用它的情况非常罕见,而您的情况100% 不是 :)

关于ruby - 如何在模块中动态调用实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43514920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com