任何人都可以告诉我
之间的区别(如果有的话)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
或者它们几乎相同?
答案 0 :(得分:11)
attr_accessor
定义getter
和setter
。attr_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 ;end
和def 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
的行为,而不必知道其内部表示。