1. ホーム
  2. ruby-on-rails

[解決済み】Rubyの受け渡しは参照渡しなのか値渡しなのか?

2022-04-05 04:34:26

質問

@user.update_languages(params[:language][:language1], 
                       params[:language][:language2], 
                       params[:language][:language3])
lang_errors = @user.errors
logger.debug "--------------------LANG_ERRORS----------101-------------" 
                + lang_errors.full_messages.inspect

if params[:user]
  @user.state = params[:user][:state]
  success = success & @user.save
end
logger.debug "--------------------LANG_ERRORS-------------102----------" 
                + lang_errors.full_messages.inspect

if lang_errors.full_messages.empty?

@user オブジェクトはエラーを lang_errors 変数が update_lanugages メソッドを使用します。 に対して保存を実行すると @user オブジェクトに保存されたエラーは失われます。 lang_errors 変数を使用します。

私がやろうとしていることは、どちらかというとハックに近いかもしれませんが(うまくいっていないようです)。私は、なぜ変数の値が洗い流されるのかを理解したいのです。参照渡しは理解しているので、どのようにして値が洗い流されることなくその変数に保持されるのかを知りたいのです。

解決方法は?

従来の用語では Ruby は厳密にパスバイバリューです . でも、ここで聞かれているのは、そういうことではないんです。

Rubyには純粋な非参照値という概念がありませんから、メソッドに渡すことはできません。変数というのは常にオブジェクトへの参照なのです。オブジェクトが変化しないようにするには、渡されたオブジェクトを複製するかクローンする必要があります。(標準的なクローンメソッドはどちらも浅いコピーなので、クローンのインスタンス変数は元のオブジェクトと同じものを指しています。そのため、クローンのインスタンス変数は、元のオブジェクトと同じオブジェクトを指しているのです)。