4

私が使用したい問題のメソッドはgem、ここから入手できます (17 ~ 42 行目): https://github.com/rails/rails/blob/master/railties/lib/rails/generators/actions.rb

ご覧のとおり、nameは 19 行目で最初の arg にmessage割り当てられ、次に 23 行目で に割り当てられname、最後にmessage26 行目で<<. 残念ながら、これは、最初の引数として渡す文字列がメソッドの外で変更されていることを意味します。

私は配列のハッシュを持っており、次のようにそれらを繰り返し処理しています:

groups = { foo: %w(foo, bar), bar: %w(foobar) }

groups.each do |group, gems|
  gems.each do |name|
    gem(name, "42")
  end
end

その後、内部の突然変異により、ハッシュは次のようになりgemます。

groups => { foo: ["foo (42)", "bar (42)"], bar: ["foobar (42)"] }

メソッドを壊すことなく、これらの文字列 (およびハッシュとその配列) が変更されるのを防ぐにはどうすればよいですか?

4

2 に答える 2

5

メソッドがその引数を変更するのを防ぐことはできません (バグ レポートを提出する以外に、これは行うべきではないためです)。

できることは、次のように、文字列のクローンを使用してメソッドを呼び出すことです。

gem(name.dup, "42")
于 2012-04-03T20:58:04.217 に答える
1

あなたはそれを呼び出すことができますname.dup

gem(name.dup, "42")

背景:gem(name)パラメータをメソッドに渡します。呼び出されたメソッド内で変更を行うと、元の変数も変更されます。

name.dupオブジェクトのコピーを作成します。このコピーは呼び出されたメソッド内で変更されますが、元の値は変更されません。


警告:dup常に機能するとは限りません。データによって異なります。ディープ コピーdupを作成しません。次の例を参照してください。

arr = ['a', 'b']
arr.dup.map{|x| x << '1'}
p arr #["a1", "b1"]

説明: 配列arrはコピーされますが、配列内のコンテンツはコピーされません。内部mapで、コピーした配列のデータを変更します。ただし、元の配列とコピーされた配列の要素は同じです。したがって、元の配列の内容も変更します。

于 2012-04-03T20:58:19.303 に答える