2016-04-22 71 views
-1

我試圖讓所有的數組方法和Ruby中的枚舉變得非常舒服,但我不明白爲什麼有些不會變異和其他人做。舉例來說,有沒有之間的差異:Ruby數組突變混淆?

def double(array) 
    array.map {|x| x * 2} 
end 

def double(array) 
    return array.map! {|x| x * 2} 
end 

此外,當我試着打

b.select{|x| x.even?} 

其中b是一個整數數組,它並沒有改變,但是

b = b.select{|x| x.even?} OR 
.delete_if 

看起來似乎改變它。

a.each do |word| 
word.capitalize! 
end 

一樣

a.map do |word| 
word.capitalize 
end 

回答

2

根據經驗,ruby methods that end in ! will mutate the value they are called on的規則和方法,不將返回一個突變副本。

這裏見map vs map!capitalize vs capitalize!

文檔還要注意的是b = b.select{|x| x.even?}沒有變異的名單b下,而是呼籲0​​創建一個全新的列表,並指定該列表b。注意區別:

在此,b是同一個對象,只是改變:

$ irb 
@irb(main):001:0> b = [1,2,3] 
=> [1, 2, 3] 
@irb(main):002:0> b.object_id 
=> 69853754998860 
@irb(main):003:0> b.select!{|x| x.even?} 
=> [2] 
@irb(main):004:0> b.object_id 
=> 69853754998860 

但在此,b現在完全是一個新的對象:

$ irb 
@irb(main):001:0> b = [1,2,3] 
=> [1, 2, 3] 
@irb(main):002:0> b.object_id 
=> 70171913541500 
@irb(main):003:0> b = b.select{|x| x.even?} 
=> [2] 
@irb(main):004:0> b.object_id 
=> 70171913502160 
+0

錯字:'capitalze!'應該是「大寫!」。另外,這個例子很好,但是可以使得select更加簡潔:b。選擇(&:偶數?) –

+0

更簡潔,是的,但不太清楚; OP對兩個類似命名的方法調用之間的區別的性質感到困惑,拋出一個新的概念,比如對它們進行測試的方法不會做任何事情,但會進一步混淆它們。感謝您的錯字! – Hamms

1

有之間的差異:

def double(array)array.map {| x | x * 2} end和

def double(array)return array.map! {| X | x * 2} end

是的。第一個返回一個新的數組。第二個修改原始數組,並返回它。

a.each做|字| word.capitalize!結束如同

a.map do | word | word.capitalize結束

否。第一個修改數組中的元素,並返回原始數組。第二個返回一個填充新字符串的新數組。