Ruby concat!或&lt; <! - (如何优雅地修改对象的状态) - >

时间:2012-12-21 11:48:31

标签: ruby-on-rails ruby operators

有更优雅的方式来做到这一点:

widget.notes.where(:author_id => a).first.message= widget.notes.where(:author_id => a).first.message << "Potato"

例如,以下内容不起作用:

widget.notes.where(:author_id => a).first.message << "Potato"
widget.notes.where(:author_id => a).first.message <<! "Potato"

分别不修改或返回错误(因为没有

<<!

运算符)

key:widget是Widget的一个实例。小部件可以有笔记。 Notes有一个attr_accessible:message。 'a'只是一个用户实例。

1 个答案:

答案 0 :(得分:3)

这不是<<不能就地修改字符串的问题 - 它确实会就地修改字符串。 <<名称中可能没有!,但它仍然像一个爆炸方法。如果您在示例代码中调用<<(其名称中有gsub!)替换!,则可以轻松查看此内容:它不会产生一些区别

在你的情况下,你得到了未更改的字符串,因为widget.notes.where(:author_id =&gt; a).first可能每次返回一个新对象,它将有自己独立的字符串。

此外,如果message对应于数据库列,而不是实例变量,我不确定调用其上的变异方法是否会起作用,因为它会绕过调用ActiveRecord(或者你正在使用的任何ORM) )setter方法。使用+=可能是您最安全的选择。

这应该可以按你的意愿运作:

note = widget.notes.where(:author_id => a).first
note.message += "Potato"
note.save