Rails指南中的代码段:
class User < ActiveRecord::Base
before_validation :normalize_name, on: :create
protected
def normalize_name
self.name = self.name.downcase.titleize
end
end
为什么我们在声明的右侧使用self.name
?我们不能说
self.name = name.downcase.titleize
答案 0 :(得分:2)
仅在使用写访问器时才使用self
似乎是一种社区约定。
# writer
self.name=
# reader
name
定义于:https://github.com/bbatsov/ruby-style-guide#no-self-unless-required。
指南示例:
# bad
def ready?
if self.last_reviewed_at > self.last_updated_at
self.worker.update(self.content, self.options)
self.status = :in_progress
end
self.status == :verified
end
# good
def ready?
if last_reviewed_at > last_updated_at
worker.update(content, options)
self.status = :in_progress
end
status == :verified
end
答案 1 :(得分:1)
你可以,但它可能使代码难以理解或导致歧义。
在双方使用self.name
时更清楚,因此阅读代码的每个人都知道会发生什么。
我使用IRB做了一个小例子来说明会发生什么:
2.1.5 :014 > class User
2.1.5 :015?> attr_accessor :name
2.1.5 :016?> def normalize_name
2.1.5 :017?> self.name = name.downcase
2.1.5 :018?> end
2.1.5 :019?> end
=> :normalize_name
2.1.5 :020 > u = User.new
=> #<User:0x007ff81282a070>
2.1.5 :021 > u.name = "NAME"
=> "NAME"
2.1.5 :022 > u.normalize_name
=> "name"
2.1.5 :023 >
所以是的,你可以做到。
但使用self.name
比较干净,所以没有歧义。