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

Ruby中能否用Lambda或函子迭代已声明的函数?

解答

首先你直接写[a,b]的话,会先执行a和b方法,把它们的返回值(这里是nil,因为puts返回nil)放进数组,这显然不是你想要的效果。要实现迭代调用方法并获取方法名,有两种常用方式:

1. 直接获取方法对象

Ruby里可以用method(:方法名)获取对应的Method对象,这个对象支持name方法获取方法名,也支持call方法执行原方法。修改后的代码如下:

def a
  puts "a"
end

def b
  puts "b"
end

[method(:a), method(:b)].each do |x|
  puts "running #{x.name}"
  x.call
end

执行这段代码会输出:

running a
a
running b
b

2. 用Lambda/Proc包装

如果想通过Lambda实现,你可以把方法逻辑包装成Lambda,或者把已有的方法转换成Lambda(用method(:a).to_proc)。

方式一:直接定义Lambda

a = -> { puts "a" }
b = -> { puts "b" }

[a, b].each do |x|
  # 注意:Lambda本身没有name方法,若需要名字,可以给Lambda绑定属性,或者在定义时单独存储
  puts "running lambda"
  x.call
end

方式二:把现有方法转成Proc

def a
  puts "a"
end

def b
  puts "b"
end

# 转换后用call执行,要获取名字仍需借助原方法对象
[[method(:a), method(:a).to_proc], [method(:b), method(:b).to_proc]].each do |name_obj, proc_obj|
  puts "running #{name_obj.name}"
  proc_obj.call
end

如果只是单纯迭代执行逻辑,直接用Lambda数组更简洁;但如果需要保留原方法的名字信息,第一种获取Method对象的方式更直接。

内容的提问来源于stack exchange,提问作者user1130176

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:37:01