lazybios

Ruby中的attr_accessor是什么?

我们假设你有一个名为Person的类。

class Person
end

person = Person.new
person.name # => no method error

显然我们从未定义过这个name方法,所以会报no method error异常。让我们现在定义下这个方法。

class Person
  def name
    @name # simply returning an instance variable @name
  end
end

person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error

现在,可以去读取这个name变量,但是这并不意味着我们可以给这个name成员变量赋值。这是两类不同的操作(方法),前者我们称之为只读方法,后了我们叫做方法。目前为止我们只有只读的name方法,还没有定义过相应的写方法。

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"

好了,通过上面的代码现在我们可以对@name实例变量进行读写操作了。但由于这类操作属于高频操作。所以如果照这个写法,我们必然会写出一大堆模板代码。介于此我们需要一个方法能让这类操作变得精简一些。

class Person
  attr_reader :name
  attr_writer :name
end

但即便如此,我们仍需要分别标识出一个变量的读写方法,这样看起来仍然存在冗余。当我们的使用场景要求我们同时兼具读写方法时,其实我们可以尝试一下attr_accessor:方法

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Dennis"
person.name # => "Dennis"

上面写法除了定义变得精简了许多之外,其它与之前两种写法效果完全相同。并且,与其它方法类似,这两个读写方法可以被用在任意方法中:

class Person
  attr_accessor :name

  def greeting
    "Hello #{@name}"
  end
end

person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"

-完-

参考引用

微信关注「日拱一卒」公众号