我正在完成The Well Grounded Rubyist,我注意到一些我不太了解的实例变量调用。直接来自TWGR(第15.2.2节):
class Person
attr_reader :name
def name=(name)
@name = name
normalize_name
end
private
def normalize_name
name.gsub!(/[^-a-z'.\s]/i, "")
end
end
normalize_name方法中的name
变量是隐式实例变量吗? @name.gsub!(/[^-a-z'.\s]/i, "")
也会有效吗?我应该注意一些惯例吗?
答案 0 :(得分:2)
normalize_name
中发生的事情是name
解析为方法self.name
,该方法由类顶部的attr_reader
类宏定义。如果您改为使用attr_accessor
,则也会定义name=
方法(但不会包含对normalize_name
的调用。
这些getter和setter方法自动访问实例变量。 name
定义的attr_accessible :name
方法看起来像这样,基本上是:
def name
@name
end
答案 1 :(得分:0)
normalize_name方法中的
name
变量是隐式实例变量吗?
不,它不是实例变量。实例变量以@
sigil开头,这不是,因为它不可能是实例变量。事实上,它根本不是的变量,而是发送消息。