Ruby中each方法执行后为何返回原始数组而非块内计算的结果?
问题原因解析
你遇到的返回值不符合预期的核心原因是**Array#each方法的设计规则**,和Ruby块返回值的处理逻辑关联如下:
1. each方法的返回值规则
Ruby中each方法的作用是遍历集合的每一个元素执行块内逻辑,它的固定返回值就是原始调用的集合本身,块内的计算结果默认不会被收集,也不会改变each的返回值。你写的a + 1只是在块内完成了计算,既没有修改原数组的元素,也没有被each方法收集作为返回结果。
2. Ruby块的返回值处理逻辑
- Ruby块的默认返回值是块内最后一行表达式的执行结果,你这段代码里每个块执行后都会返回
a + 1的结果,但each方法本身设计就是忽略块的返回值,仅完成遍历动作。 - 如果你需要收集每个块的返回值生成新数组,应该使用
map(别名collect)方法,这个方法的设计就是收集每一次块执行的返回值,组合成新数组作为方法的返回结果。
正确实现代码
x = [1, 2, 3, 4, 5] # 使用map方法收集块返回值 result = x.map do |a| a + 1 end # 此时result的值就是 [2, 3, 4, 5, 6]
补充说明
如果你想要直接修改原数组的元素,可以使用带感叹号的map!方法,直接修改调用者本身:
x = [1, 2, 3, 4, 5] x.map! do |a| a + 1 end # 此时x本身的值变为 [2, 3, 4, 5, 6]
内容的提问来源于stack exchange,提问作者John ayouce
相关产品推荐
相关产品推荐

