无法调用Ruby Lambda?传递Lambda至Proc接收函数报错排查
Ruby Lambda传递错误的原因与解决方法
错误原因
你的函数call_proc_with_arg定义的参数是&b——这是块参数,专门用来捕获函数调用时跟随的代码块(比如call_proc_with_arg { ... }这种形式)。
当你直接调用call_proc_with_arg(lam)时,lam被当作一个普通的位置参数传递,但函数定义里没有声明位置参数,所以Ruby会抛出ArgumentError(给定1个参数,预期0个)。此时函数内部的b并不是你传的lam,而是nil(因为没有传递块),这也是错误的深层原因。
两种解决方案
方案1:将Lambda转换为块传递
调用函数时,用&操作符把Lambda对象转换成块,这样块参数&b就能正确捕获到它:
call_proc_with_arg(&lam)
&操作符的作用是把Proc/Lambda对象转换为代码块,和直接写{ |a| puts ... }的效果完全一致。
方案2:修改函数参数为Proc类型
如果需要显式传递Lambda/Proc对象,可以把函数的参数改成普通的Proc参数,而非块参数:
def call_proc_with_arg(b) b.call(1) end # 此时直接传递lam即可正常运行 call_proc_with_arg(lam)
关键要点区分
- 块参数
&b:用于接收函数调用时的代码块(如func { ... }),Ruby会自动把代码块转换成Proc对象赋值给b。 - 普通Proc参数:用于直接接收显式传入的Proc/Lambda对象,不需要
&转换。
内容的提问来源于stack exchange,提问作者Kannan Ramamoorthy
相关产品推荐
相关产品推荐

