Ruby中如何将方法同时作为普通方法和块调用并传递参数?
解决方案
针对你的需求,有两种常见实现方式,取决于你是否需要让shared_method接收method_that_needs_a_block!传递的块参数:
场景1:块内固定调用shared_method带指定参数
如果method_that_needs_a_block!仅要求必须传入块,但块无需接收它传递的参数,你可以用lambda封装重复调用逻辑,既能直接执行lambda,也能把它转为块传递:
class Foo def bar # 用lambda封装shared_method的调用逻辑 shared_call = -> { shared_method('a', 'b') } if condition # 用&把lambda转为块传递给方法 return method_that_needs_a_block!('string', named1:, named2:, &shared_call) end # 直接执行lambda,等价于调用shared_method('a', 'b') shared_call.call end def shared_method(arg1, arg2) puts arg1 puts arg2 end end
场景2:shared_method需要接收块参数
如果method_that_needs_a_block!会向块传递参数,且你希望shared_method直接处理这些参数,可使用method方法获取shared_method的方法对象,再用&转为块:
class Foo def bar if condition # 用method(:shared_method)拿到方法对象,&将其转为块 # 此时method_that_needs_a_block!传递的参数会直接传给shared_method return method_that_needs_a_block!('string', named1:, named2:, &method(:shared_method)) end # 直接调用shared_method,手动传递参数 shared_method('a', 'b') end def shared_method(arg1, arg2) puts arg1 puts arg2 end end
补充说明
&符号在Ruby中的作用是将可调用对象(lambda、proc、方法对象)转换为块。method(:shared_method)会自动绑定当前Foo实例的上下文,无需额外处理。
内容的提问来源于stack exchange,提问作者ryanpback
相关产品推荐
相关产品推荐

