为何Lambda函数配合Ruby的each方法使用时出现参数错误?
为什么你的Lambda传入each会报错?
这个问题核心是混淆了Ruby里**代码块(block)和Lambda(Proc对象)**的使用逻辑,咱们拆解来看:
1. each方法的参数预期
Ruby的each这类迭代方法,默认期望接收的是代码块(就是用{...}或do...end包裹的代码片段),而不是一个Lambda对象。你写的->(i) {p i}是Lambda的简写形式,本质是一个Proc对象——当你直接把它传给each时,Ruby会把它当作一个普通的方法参数,但each本身定义时不需要任何参数,所以立刻抛出ArgumentError: wrong number of arguments (given 1, expected 0)的错误。
这时候根本没到Lambda接收参数的环节,错误是each先发现自己被多传了一个参数,和Lambda的参数定义无关。
2. Lambda和Block的本质区别
- 块是Ruby特有的语法结构,不是对象,它依附于方法调用存在,方法内部通过
yield来触发执行; - Lambda是Proc对象的一种,是实实在在的对象,需要通过
call方法或者被转换为块才能执行。
正确的写法
如果你想用Lambda来实现这个逻辑,或者坚持用Lambda语法,有两种解决方式:
方式一:直接用代码块(最常规写法)
这是Ruby迭代最常用的方式,直接把逻辑写在块里:
(1..10).each { |i| p i } # 或者用更适合多行代码的do...end (1..10).each do |i| p i end
方式二:用&把Lambda转换为块
Ruby里的&操作符可以把Proc对象(包括Lambda)转换为方法期望的块参数,这样each就能正确识别并执行了:
(1..10).each(&->(i) { p i })
这里的&会自动调用Lambda的to_proc方法,把它转换成块,让each可以通过yield来触发执行。
内容的提问来源于stack exchange,提问作者shampoo
相关产品推荐
相关产品推荐

