如何让`self`在课堂上工作

时间:2013-11-13 05:33:53

标签: ruby-on-rails ruby

我希望在将用户的电子邮件地址保存到rails中的数据库之前将其缩小。我在this page使用此代码:

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

如果我写self.email = self.email.downcase它也有效,但如果我写email = email.downcase则不起作用。在哪种情况下可以省略self

2 个答案:

答案 0 :(得分:7)

当希望在作业的左侧使用setter 1 时,

self必须始终self.x = valself.x += val 2

当没有影响方法的局部变量时,可以为getter(只是常规方法调用)省略

self

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


1 有关如何实施getter / setter,请参阅What is attr_accessor in Ruby?

2 当ruby看到self.x = y时,它会将其视为self.__send__(:x=, y)。也就是说,setter(它只是名称中尾随等号的普通方法)被神奇地称为。

答案 1 :(得分:1)

email = email.downcase

创建一个新变量,覆盖email的类合成。我的经验法则是始终使用self作为前缀属性。虽然Ruby允许你做任何一件事,但这是 POLS 或最低惊喜原则的一部分。当您与其他开发人员合作时,如果他们不必深入挖掘您的代码,并且只知道电子邮件是一个属性,那就更好了。底线,不要忽略self

为了上帝的缘故,将代码空间化了一点。可读性是关键。

before_save { self.email.downcase! }