地图和地图的意外影响!在红宝石中



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"]

不是。示例中mapmap!的返回值是相同的。(嗯,不是真的: 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"]

最新更新