能否同时向Ruby方法传递数组与block作为参数?
解决你的Ruby Block参数传递问题
嘿,很高兴看到你自己动手实现类似map的方法!你的代码逻辑本身是没问题的,但问题出在调用方法时传递block的方式上,我来给你拆解清楚:
问题所在
你写的调用代码是:
mapper([1,2,3,4], {|i| i * 2})
这里的核心问题是:Ruby会把紧跟在逗号后的{...}解析成哈希字面量(而不是你想要的block),但你的方法定义def mapper(arr, &prc)只接受1个必选数组参数,加上一个可选的block参数(通过&prc声明)。这就导致Ruby认为你传了2个参数(数组和空哈希),和方法预期的参数数量不匹配,所以会抛出ArgumentError之类的报错。
正确的调用方式
有两种常见的正确写法,都能让Ruby正确识别你传递的block:
1. 直接传递block(最常用的写法)
去掉逗号,把block直接跟在方法调用后面,用大括号或者do...end都可以:
# 大括号写法(适合单行逻辑) mapper([1,2,3,4]) { |i| i * 2 } # do...end写法(适合多行逻辑) mapper([1,2,3,4]) do |i| i * 2 end
2. 显式传递Proc对象
如果你需要先把block存成Proc变量,再传递给方法,要在变量前加&,把Proc转换成block参数:
# 先定义一个Proc对象 double_proc = Proc.new { |i| i * 2 } # 用&符号把Proc转成block传递给方法 mapper([1,2,3,4], &double_proc)
优化你的方法(可选)
你的方法逻辑是完全正确的,但可以调整得更符合Ruby的风格,比如用each替代length.times,代码会更直观易读:
def mapper(arr, &prc) new_array = [] arr.each do |element| new_array << prc.call(element) end new_array end
现在再调用的话,就能得到你预期的[2, 4, 6, 8]结果啦!
内容的提问来源于stack exchange,提问作者user7452246
相关产品推荐
相关产品推荐

