Ruby 为什么';t地图!如果像我期望的那样工作?

Ruby 为什么';t地图!如果像我期望的那样工作?,ruby,Ruby,当我运行以下代码时: range = [2,3,4,5,6,7,8,9,10] range.each {|z| print z, " "} puts "\n" range.map! {|y| y /= 3 if y % 3 == 0} range.each {|z| print z, " "} 我得到以下输出: 2 3 4 5 6 7 8 9 10 nil 1 nil nil 2 nil nil 3 nil 而我希望第二行输出包含: 2 1 4 5 2 7 8 3 10 我做错了什么?我是

当我运行以下代码时:

range = [2,3,4,5,6,7,8,9,10]
range.each {|z| print z, " "}
puts "\n"
range.map! {|y| y /= 3 if y % 3 == 0}
range.each {|z| print z, " "}
我得到以下输出:

2 3 4 5 6 7 8 9 10
nil 1 nil nil 2 nil nil 3 nil
而我希望第二行输出包含:

2 1 4 5 2 7 8 3 10
我做错了什么?我是否误解了
映射
操作符的方式及其关联的代码块应该如何工作


注意:在用C/C++广泛编程多年后,我正在学习Ruby,这是我一直在学习的不工作Ruby程序的最小片段。如果需要,我也可以粘贴我用以构建此MWE的原始程序。

y/=3如果y%3==0
本身就是一个完整的表达式。当条件部分的计算结果为false时,整个表达式的计算结果为
nil
<代码>地图正在就地修改数组,它不在乎结果元素是数字还是
nil

重写以获得所需输出的一种方法是:

range.map! {|y| y % 3 == 0 ? y / 3 : y}
替换为:

range.map! {|y| y % 3 == 0 ? y / 3 : y}

map
使用从块返回的值。更改临时
y
变量没有意义

那么,您将如何更改程序?如果该块是一组do-end复杂指令,那么map将存储最后计算的表达式的值,类似于从方法返回值的方式?是的,使用最后一个表达式的值。您还可以使用
next obj
从块“返回”
obj
。本质上
next
是块的
return
。(请注意,lambda的行为也略有不同,因为它们是传统意义上的更多函数)@azgult:经验法则:lambda的行为类似于方法,proc的行为类似于块。