attr_accessor vs attr_reader&实例变量

时间:2013-11-16 13:02:22

标签: ruby

任何人都可以告诉我

之间的区别(如果有的话)
class Car
  attr_accessor :engine
  def initialize(engine)
    self.engine = engine
  end
end

class Car
  attr_reader :engine
  def initialize(engine)
    @engine = engine
  end
end

或者它们几乎相同?

3 个答案:

答案 0 :(得分:11)

attr_accessor定义gettersetterattr_reader仅定义getter

class Car
  attr_reader :engine
  def initialize(engine)
    @engine = engine
  end
end

Car.instance_methods(false) # => [:engine]

使用上面的代码,您只定义了def engine; @engine ;end

class Car
  attr_accessor :engine
  def initialize(engine)
    self.engine = engine
  end
end

Car.instance_methods(false) # => [:engine, :engine=]

使用上述代码,您只定义了def engine; @engine ;enddef engine=(engine) ;@engine = engine ;end

答案 1 :(得分:4)

attr_accessor:engine 允许您读取和写入变量@engine。

attr_reader:engine 只允许您读取@engine的值

self.engine = engine @engine = engine 几乎做同样的事情。

答案 2 :(得分:0)

不,他们不一样。

在第一个示例中,您定义了一个方法engine=,并在initialize内调用该方法。例如,这将允许Car的子类覆盖engine=来执行特定的操作,然后当您调用initialize时,方法调用将被调度到 重写方法。这允许子类扩展Car的行为,而不必知道其内部表示。