一些誤解比方說,我有以下的代碼塊:使用陣列#地圖方法
arr = ['a','b','c']
arr.map {|item| item <<'1'} #=> ['a1','b1','c1']
arr #=> ['a1','b1','c1']
爲什麼Array#map
變化的陣列?它只應該創建一個新的。當我在塊中使用+
而不是<<
時,它按預期工作。 Array#each
更改數組本身,還是它只遍歷它並返回自身?
一些誤解比方說,我有以下的代碼塊:使用陣列#地圖方法
arr = ['a','b','c']
arr.map {|item| item <<'1'} #=> ['a1','b1','c1']
arr #=> ['a1','b1','c1']
爲什麼Array#map
變化的陣列?它只應該創建一個新的。當我在塊中使用+
而不是<<
時,它按預期工作。 Array#each
更改數組本身,還是它只遍歷它並返回自身?
我的問題是:爲什麼
map
更改數組?它只應該創造新的。
map
不改變Array
。但<<
更改Array
中的String
。
參見the documentation for String#<<
:
str << obj → str
追加-串接給定的對象到
str
。
雖然沒有明確提及它,代碼例子清楚地表明<<
變異它的接收器:
a = "hello "
a << "world" #=> "hello world"
a.concat(33) #=> "hello world!"
這很奇怪,因爲當我使用
+
運營商在塊insted的的<<
它按預期工作。
+
不會更改Array
中的String
s。
見the documentation for String#+
:
str + other_str → new_str
級聯,返回包含
other_str
連接起來以str
新String
。
請注意它是如何表示「新String
」並且返回值爲new_str
。
而我的第二個問題:
Array#each
更改數組本身或它只是迭代數組並返回自己?
Array#each
不改變Array
。但當然,在阻止傳遞給Array#each
可能會或可能不會改變個別元素的Array
:
arr = %w[a b c]
arr.map(&:object_id) #=> an array of three large numbers
arr.each {|item| item <<'1' } #=> ['a1', 'b1', 'c1']
arr.map(&:object_id) #=> an array of the same three large numbers
正如你所看到的,Array#each
沒有改變Array
:它仍然是相同的Array
與相同的三個要素。
使用map
或each
使得外部陣列上的差異(map
將返回一個新的數組,each
將返回原來的數組),但它不會做什麼字符串數組包含差異;在任何一種情況下,數組中包含的字符串都將被修改爲原始字符串。