Est Ruby passer par référence ou par valeur?

@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 objet ajoute les erreurs à la lang_errors variable dans le update_lanugages méthode.
lorsque j'effectue une sauvegarde sur le @user objet que je perds les erreurs qui ont été initialement stockées dans le lang_errors variable.

Si ce que je cherche à faire serait de plus d'un hack (ce qui ne semble pas fonctionner). J'aimerais comprendre pourquoi les valeurs de la variable sont délavées. Je comprends passage par référence, donc je voudrais savoir comment la valeur peut être tenu dans cette variable sans être lavé.

  • Je remarque aussi que je suis en mesure de conserver cette valeur dans un objet cloné
  • Vous devriez regarder Abe Voelker réponse. Mais après avoir exécuté autour du bloc sur ce, voici comment je dirais ça. lorsque vous transmettez un objet Foo à une procédure, une copie de la référence à l'objet est passé, un bar, un Passage par valeur. vous ne pouvez pas modifier l'objet qui les Foo points, mais vous pouvez modifier le contenu de l'objet vers lequel il pointe. Donc, si vous passez un tableau, le contenu du tableau peut être modifié, mais vous ne pouvez pas modifier ce tableau est d'être référencé. agréable d'être en mesure d'utiliser les méthodes de Foo sans avoir à vous soucier de gâcher autres dépendances sur Foo.
InformationsquelleAutor Sid | 2009-12-09