Ruby实例变量语法

时间:2012-03-17 03:45:42

标签: ruby

我正在完成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, "")也会有效吗?我应该注意一些惯例吗?

2 个答案:

答案 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开头,这不是,因为它不可能是实例变量。事实上,它根本不是的变量,而是发送消息。