map
如何更改原始数组不应该的数组?
arr = ['Foo','Bar','Tango']
arr.map do |name|
name[0] = 'A'
end
arr # => ["Aoo", "Aar", "Aango"]
为什么map!
中的相同块使"完全不同的返回?
arr = ['Foo','Bar','Tango']
arr.map! do |name|
name[0] = 'A'
end
arr # => ["A", "A", "A"]
在第一个示例中, map
产生一个新数组(由于未分配给var,立即丢弃了新数组(,但是该块包含修改对象的副作用在数组中包含(即,阵列本身没有被触摸,但没有任何阻止您从数组中获取一个对象并更改它 - 如果它是可变的,如果它是可变的;顺便说一句,字符串是可变的,是可变的,实际上s = "hi"; s[0]="x"; s # => "xi"
(。
在第二个示例中, map!
确实更改了原始数组,并带有块的结果值,这是每个元素的 'A'
(这是分配表达式的结果,它也偶然地修改了数组的原始元素 - 但是它们被丢弃以来,自从相应地替换为map!
的语义(。
来自Ruby-Doc:
-
map { |item| block } → new_ary
:每一个自我元素一次调用给定的块一次。创建一个新数组包含块返回的值。 -
map! {|item| block } → ary
:每一个自我元素一次调用给定的块一次,用块返回的值替换元素。
map
如何更改原始数组不应该的位置?arr = ['Foo','Bar','Tango'] arr.map do |name| name[0] = 'A' end arr # => ["Aoo", "Aar", "Aango"]
不是。map
不会更改数组,您的块确实。实际上,要真正确切:块也不会更改数组,它会更改数组的每个元素。
为什么
"map!
中的相同块使"完全不同的返回?arr = ['Foo','Bar','Tango'] arr.map! do |name| name[0] = 'A' end arr # => ["A", "A", "A"]
不是。示例中map
和map!
的返回值是相同的。(嗯,不是真的: map
返回a new 数组, map!
返回相同的数组,修改了,但是这两个返回的阵列的内容是相同的。(但是您永远不会即使查看返回值,您也只会忽略它,因此如何使返回值不同的陈述?
map!
通过用块的值替换每个元素来突变数组。该块包含一个分配表达式,分配表达式对其左侧进行评估,ERGO块为每个元素返回'A'
,这意味着每个元素都被'A'
替换。
请注意,map
做同样的事情:
arr = %w[Foo Bar Tango]
new_arr = arr.map do |name| name[0] = 'A' end
arr #=> ["Aoo", "Aar", "Aango"]
new_arr #=> ["A", "A", "A"]