Ruby中如何引用为已有类添加的方法?
问题原因
你定义的foo是String类的实例方法——它只能被String类的实例(比如"test"这样的字符串对象)调用,而String.foo或String.method("foo")是在尝试调用String类本身的类方法,这两者不属于同一范畴,自然会抛出NoMethodError。
解决办法
根据你的需求(把foo传递给bar方法),分两种情况处理:
1. 把foo改为类方法
如果你的foo逻辑就是要直接通过String类调用,直接用self.foo定义类方法即可:
class String def self.foo puts "Hello World." end end # 现在可以正常调用类方法 String.foo # 输出 "Hello World." # 也能获取类方法对象传给bar bar(String.method('foo'))
2. 保留实例方法,传递实例方法对象
如果foo必须是实例方法(需要作用在具体字符串上),你需要用instance_method获取未绑定的实例方法对象,传给bar后,调用时要绑定到String实例上:
class String def foo puts "Hello World." end end # 示例bar方法,接收未绑定方法后绑定实例调用 def bar(unbound_method) # 绑定到任意String实例,比如空字符串 unbound_method.bind("").call end # 传递实例方法对象 bar(String.instance_method(:foo))
内容的提问来源于stack exchange,提问作者Malte
相关产品推荐
相关产品推荐

