我正在学习each
如何在ruby中工作的细节,我尝试了以下代码行:
p [1,2,3,4,5].each { |element| el }
结果是一个
数组[1,2,3,4,5]
但我不认为我完全明白为什么。为什么each
的返回值是相同的数组?难道每个都不提供迭代方法吗?或者each
方法返回原始值只是常见做法吗?
答案 0 :(得分:24)
Array#each
返回它被调用的[array]对象:块的结果是被丢弃。因此,如果原始数组没有 icky 副作用,那么一切都不会改变。
也许您的意思是使用map
?
p [1,2,3,4,5].map { |i| i*i }
答案 1 :(得分:3)
Array#each的块形式返回原始Array对象。当你想要做某事件时,你通常会使用#each与块内的数组的每个元素。例如:
[1, 2, 3, 4, 5].each { |element| puts element }
这将打印出每个元素,但返回原始数组。您可以通过以下方式验证:
array = [1, 2, 3, 4, 5]
array.each { |element| element }.object_id === array.object_id
=> true
如果要返回 new 数组,则需要使用Array#map或其中一个同义词。 #map的块形式返回不同的Array对象。例如:
array.object_id
=> 25659920
array.map { |element| element }.object_id
=> 20546920
array.map { |element| element }.object_id === array.object_id
=> false
当您想要对原始数组的修改版本进行操作时,通常需要使用#map,同时保持原始数据不变。
答案 2 :(得分:2)
所有方法都返回一些东西。即使它只是一个nil
对象,它也会返回一些内容。
它也可以返回原始对象而不是返回nil
。
答案 3 :(得分:1)
如果出于某种原因想要抑制输出(例如,在控制台中进行调试),可以通过以下方法实现
[1,2,3,4,5].each do |nr|
puts nr.inspect
end;nil