3

私はいつも配列とハッシュのドキュメントで置換を目にしますが、それは奇妙だといつも思います。

私はこのようなことを何度もやったと確信しています:

a = [:a, :b, :c, :d]

...

if some_condition
    a = [:e, :f]
end

しかし、代わりにこれを使用することは考えていませんでした:

a = [:a, :b, :c, :d]

...

if some_condition
    a.replace [:e, :f]
end

私が想定しているのは、使用目的です。これは本当にメモリを節約しますか、それとも他の利点がありますか、それとも単にスタイルの問題ですか?

4

3 に答える 3

5

メソッドに渡された配列をその場で変更することが意図されていると思います。例えば:

def m(a)
    a.replace(%w[a b])
end

a = %w[x y z]
m(a)
# a is now ['a', 'b']

がなければreplace、次のようにする必要があります。

def m(a)
    a.clear
    a << 'a' # or use .push of course
    a << 'b'
end

let you do it all at onceを使用replaceすると、配列の内容 (配列自体ではなく!) を要素ごとに置き換えることの副作用となる自動縮小および自動拡張 (おそらくメモリのコピーを含む) 動作を回避する必要があります。パフォーマンス上の利点 (もしあれば) はおそらく余分なものです。主な目的は、ポインターを導入したり、配列を追加のオブジェクトでラップしたりすることなく、ポインターからポインターへの動作を取得することです。

于 2012-04-12T05:31:01.957 に答える
1
a = [:a, :b, :c, :d]
b = [:x, :y, :z]
a.replace(b)

a.object_id == b.object_id
=> false

a = [:a, :b, :c, :d]
b = [:x, :y, :z]
a = b

a.object_id == b.object_id
=> true

また

a = [:a, :b, :c, :d]
c = a
b = [:x, :y, :z]
a.replace(b)
p c # => [:x, :y, :z]

vs

a = [:a, :b, :c, :d]
c = a
b = [:x, :y, :z]
a = b
p c # => [:a, :b, :c, :d]

これはあなたの質問に正確に答えるものではありません。

于 2012-04-12T05:35:18.197 に答える