Ruby self 什么情况下可以省略?

xiaoronglv · 2012年10月20日 · 最后由 vincenttone 回复于 2012年10月24日 · 2991 次阅读

这个方法用于更新 ruby-china 帖子的最后回复时间,推送短消息给关注者。

https://github.com/rubytaiwan/ruby-taiwan/blob/production/app/models/reply.rb#L22

def update_parent_topic
    topic.update_replied_at(self)
    topic.push_follower(self.user)
end

我个人疑惑的地方:topic 这个对象平白无故的怎么调用过来的?

按照我的理解应该写为

def update_parent_topic
    self.topic.update_replied_at(self)
    self.topic.push_follower(self.user)
end

#1 楼 @ywencn

还是有疑问。

topic.update_replied_at(self) 又不是一个私有方法,为什么要省略 self 呢?

#3 楼 @xiaoronglv 注意,是私有方法只能隐式调用,而公有方法则是看你喜好,#4 楼 @ywencn 蜗牛说的没错,大家平时都是能省略就省略了。self 表示当前对象,当省略 self 的时候,Ruby 会在当前的 binding 中找到 self(当前对象),并在它上调用这个方法。在实例方法中,self 就是当前实例对象;在类方法中,self 就是当前类对象;在全局中,self 就是 main 对象。关于更多细节,可以看一下《Ruby 元编程》这本书,里边还有打破我前边说的规则的方法,不过一般别用。

我从不省略 self,这样既容易区分共有方法和局部变量,又不容易出错(不能省略的时候省略了)。

多余的 self 当然要删掉,DRY = don't repeat your self

7 楼很有幽默感 😄

需要 登录 后方可回复, 如果你还没有账号请 注册新账号