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
相关产品推荐
相关产品推荐

