attr_accessor与attr_reader和实例变量

lem*_*mon 4 ruby

谁能告诉我两者之间的区别(如果有的话)

class Car
  attr_accessor :engine
  def initialize(engine)
    self.engine = engine
  end
end
Run Code Online (Sandbox Code Playgroud)

class Car
  attr_reader :engine
  def initialize(engine)
    @engine = engine
  end
end
Run Code Online (Sandbox Code Playgroud)

或者它们几乎相同?

Aru*_*hit 12

attr_accessor定义gettersetter.attr_reader仅定义getter.

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

Car.instance_methods(false) # => [:engine]
Run Code Online (Sandbox Code Playgroud)

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

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

Car.instance_methods(false) # => [:engine, :engine=]
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,您只定义def engine; @engine ;enddef engine=(engine) ;@engine = engine ;end.


Sea*_*udt 6

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

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

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