0

当我运行以下代码时:

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。

4

2 回答 2

7

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

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

range.map! {|y| y % 3 == 0 ? y / 3 : y}
于 2013-05-19T20:31:30.817 回答
3

替换为:

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

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

于 2013-05-19T20:31:35.693 回答