2016-04-22 10 views
-1

私はRubyのすべての配列メソッドと列挙型で非常に快適になるようにしようとしていますが、変異のないものと変異しないものは分かりません。私はbが整数の配列であり、それは変更されませんでしたRuby配列の突然変異の混乱?

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

を呼び出すようにしようとしたとき

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

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

、また:たとえば、違いがありますしかし、

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

が見えましたそれを突然変異させる。

経験則として
a.map do |word| 
word.capitalize 
end 

答えて

2

ruby methods that end in ! will mutate the value they are called on、および変異したコピーを返しますなしの方法と同じ

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

です。

b = b.select{|x| x.even?}リストbを変異されるのではなく、全く新しいリストを作成するb.selectを呼び出している、とbにそのリストを割り当てることに注意してください、ここでmap vs map!capitalize vs capitalize!

のマニュアルを参照してください。違いに注意してください。この中

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

Typo: 'capitalze!' '大文字にしてください!'また、この例は問題ありませんが、selectをさらに簡潔にすることができます。b。(&:even?) –

+0

をより簡潔に選択してください。 OPは、同様の名前の2つのメソッド呼び出しの違いの性質について混乱していました。メソッド呼び出しのような新しいコンセプトを投げることは、何もするつもりはありませんが、さらに混乱させます。タイプミスをありがとう! – Hamms

1

があります次の間の差異:

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

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

はい。最初の配列は新しい配列を返します。 2番目の配列は元の配列を変更して返します。

a.eachんです|言葉| word.capitalize!同じように終了

a.map do | word | word.capitalize end

いいえ最初の配列は、配列の要素を変更し、元の配列を返します。 2番目は新しい文字列でいっぱいになった新しい配列を返します。

関連する問題