当我运行以下代码时:
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
我做错了什么?我误解了map
运算符的方式以及它的相关代码块应该如何工作?
注意:我在使用C / C ++编程很多年后学习Ruby,这是我一直坚持的非工作Ruby程序的最小片段。如果需要,我可以粘贴原来的程序,我也构建了这个MWE。
答案 0 :(得分:7)
y /= 3 if y % 3 == 0
本身就是一个完整的表达。当条件部分的计算结果为false时,整个表达式的计算结果为nil
。 map!
正在就地修改数组,并不关心结果元素是数字还是nil
。
重写它以获得所需输出的一种方法是:
range.map! {|y| y % 3 == 0 ? y / 3 : y}
答案 1 :(得分:3)
替换为:
range.map! {|y| y % 3 == 0 ? y / 3 : y}
map
使用块中返回的值。改变临时y
变量毫无意义。