首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >attr_accessor与attr_reader &实例变量

attr_accessor与attr_reader &实例变量
EN

Stack Overflow用户
提问于 2013-11-16 13:02:22
回答 4查看 6.8K关注 0票数 8

有谁能告诉我(如果有的话)

代码语言:javascript
复制
class Car
  attr_accessor :engine
  def initialize(engine)
    self.engine = engine
  end
end

代码语言:javascript
复制
class Car
  attr_reader :engine
  def initialize(engine)
    @engine = engine
  end
end

或者它们实际上是一样的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-16 13:03:10

attr_accessor定义gettersetterattr_reader只定义getter

代码语言:javascript
复制
class Car
  attr_reader :engine
  def initialize(engine)
    @engine = engine
  end
end

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

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

代码语言:javascript
复制
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

票数 17
EN

Stack Overflow用户

发布于 2013-11-16 13:07:43

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

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

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

票数 7
EN

Stack Overflow用户

发布于 2021-08-22 06:51:07

他们是不一样的

用代码来解释它

代码语言:javascript
复制
car = Car.new('cool engine')

对读者来说,你只能阅读。

代码语言:javascript
复制
car.engine 
# cool engine

但你做不到

代码语言:javascript
复制
car.engine = 'even cool engine'

对于attr_accessor,您可以同时进行读写

代码语言:javascript
复制
car.engine
# cool engine
car.engine = 'even cool engine'
car.engine
# even cool engine

例如,变量

如果不想将实例变量公开给外部世界,只使用实例变量

代码语言:javascript
复制
class Car
  # You don't need to use attr_reader and attr_accessor here if you don't want to expose them to outside world
  def initialize(engine)
    @engine = engine
  end
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20018784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档