You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:10:30