为什么地图可枚举 return 值不是 return 预期值
Why does map enumerable return value not return expected value
我非常熟悉 Ruby Enumerable 模块,至少我是这么认为的。采取以下代码片段:
names = [ "Donald", "Daisy", "Daffy" ]
new_empty_array = []
new_names_array = names.map do |name|
new_empty_array << name
end
puts new_names_array.inspect
# prints [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]]
我知道我没有正确使用 map
,但我正在教一堂关于 Ruby 可枚举的课程,并且在学生测试 map
时遇到了这个例子。铲子(<<
)运算符的return值为添加元素后的数组。结果不应该是:
[["Donald"], ["Donald", "Daisy"], ["Donald", "Daisy", "Daffy"]]
好像整个循环都在处理,铲子算子的最终return值也被处理了?给出了什么?
在您的例子中,map
的结果是一个数组,其中包含多次对同一数组 new_empty_array
的引用。您不是在创建三个不同的数组,而是在 map
块中修改同一个数组。
要获得您期望的输出,您需要执行以下操作:
new_names_array = first_names.map do |name|
(new_empty_array << name).dup
end
附带说明一下,您可以使用这段比上面的代码更明显的代码来获得您想要的输出:
(1..first_names.size).map do |num|
first_names.take(num)
end
#=> [["Donald"], ["Donald", "Daisy"], ["Donald", "Daisy", "Daffy"]]
new_names_array = first_names.map do |name|
name
end
会给出 ["Donald", "Daisy", "Daffy"]
.
first_names
的每个元素 return 都是由 map
创建的新数组的值,但您 return 为每个元素创建了一个新数组,new_empty_array
.
这个对象 <<
三次,最后有三个名字,所以 3 x 3 个元素:
[new_empty_array, new_empty_array, new_empty_array] = [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]]
我非常熟悉 Ruby Enumerable 模块,至少我是这么认为的。采取以下代码片段:
names = [ "Donald", "Daisy", "Daffy" ]
new_empty_array = []
new_names_array = names.map do |name|
new_empty_array << name
end
puts new_names_array.inspect
# prints [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]]
我知道我没有正确使用 map
,但我正在教一堂关于 Ruby 可枚举的课程,并且在学生测试 map
时遇到了这个例子。铲子(<<
)运算符的return值为添加元素后的数组。结果不应该是:
[["Donald"], ["Donald", "Daisy"], ["Donald", "Daisy", "Daffy"]]
好像整个循环都在处理,铲子算子的最终return值也被处理了?给出了什么?
在您的例子中,map
的结果是一个数组,其中包含多次对同一数组 new_empty_array
的引用。您不是在创建三个不同的数组,而是在 map
块中修改同一个数组。
要获得您期望的输出,您需要执行以下操作:
new_names_array = first_names.map do |name|
(new_empty_array << name).dup
end
附带说明一下,您可以使用这段比上面的代码更明显的代码来获得您想要的输出:
(1..first_names.size).map do |num|
first_names.take(num)
end
#=> [["Donald"], ["Donald", "Daisy"], ["Donald", "Daisy", "Daffy"]]
new_names_array = first_names.map do |name|
name
end
会给出 ["Donald", "Daisy", "Daffy"]
.
first_names
的每个元素 return 都是由 map
创建的新数组的值,但您 return 为每个元素创建了一个新数组,new_empty_array
.
这个对象 <<
三次,最后有三个名字,所以 3 x 3 个元素:
[new_empty_array, new_empty_array, new_empty_array] = [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]]