2

我想在将用户的电子邮件地址保存到 Rails 中的数据库之前将其小写。我在此页面上使用此代码:

class User < ActiveRecord::Base
  before_save {self.email = email.downcase}
end

如果我写它也可以self.email = self.email.downcase,但如果我写它就不起作用email = email.downcase。什么情况下可以self省略?

4

2 回答 2

7

self当希望在分配的左侧使用设置器1时,必须始终提供,例如or 2self.x = valself.x += val

self当没有隐藏方法的局部变量时,可以省略 getter(只是普通的方法调用)。

x = valor形式的表达式x += val- 也就是说,没有self-总是分配给局部变量x。在这种情况下,这意味着将一个值分配给局部变量email(不要与 混淆self.email),然后在块退出时将其丢弃。


1请参阅Ruby 中的 attr_accessor 是什么?了解 getter/setter 的实现方式。

2当 ruby​​ 看到self.x = y它时,它会像对待它一样对待它self.__send__(:x=, y)。也就是说,setter(这只是一个名称中带有尾随等于的普通方法)被神奇地调用。

于 2013-11-13T05:37:29.023 回答
1
email = email.downcase

创建一个新变量,覆盖 的类综合email。我的经验法则是总是在属性前加上self. 虽然 Ruby 允许您这样做,但这是POLS或最小惊喜原则的一部分。当您与其他开发人员一起工作时,最好不要让他们深入研究您的代码,并且只知道电子邮件是一个属性。底线,不要省略self

看在上帝的份上,把你的代码留出一点空间。可读性是关键。

before_save { self.email.downcase! }
于 2013-11-13T05:39:58.357 回答