为什么不映射!如果像我期望的那样工作?

时间:2013-05-19 20:29:17

标签: 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

我做错了什么?我误解了map运算符的方式以及它的相关代码块应该如何工作?

注意:我在使用C / C ++编程很多年后学习Ruby,这是我一直坚持的非工作Ruby程序的最小片段。如果需要,我可以粘贴原来的程序,我也构建了这个MWE。

2 个答案:

答案 0 :(得分:7)

y /= 3 if y % 3 == 0本身就是一个完整的表达。当条件部分的计算结果为false时,整个表达式的计算结果为nilmap!正在就地修改数组,并不关心结果元素是数字还是nil

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

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

答案 1 :(得分:3)

替换为:

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

map使用块中返回的值。改变临时y变量毫无意义。