Ruby的attr_accessor介绍

Ruby 的attr_accessor介绍
Ruby中是没有属性(property/attribut)这样的东西。在Ruby中从对象外部不能直接访问实例变量或对实例变量赋值,需要通过该方法来访问对象的内部。假设有下面的例子:

class HelloWorld
  def initialize(myname = "Ruby")
    @name = myname
  end
end
bob = HelloWorld.new("ruby")
bob.name = "Bob"
puts bob.name

乍一看,没什么问题。应该输出结果是Bob。可是控制台输出为:

helloworld.rb:7:in `<main>': undefined method `name' for #<HelloWorld:0x007fbde293f0b0 @name="Bob"> (NoMethodError)

在Ruby中我们知道,如果是括号内的参数,括号是可以直接省略的。所以,对于bob.name,由于Ruby中是没有属性的,其实我们调用的是bob.name().name()方法。对于bob.name = "Bob"实际是执行bob.name = ("Bob")方法,上面两个方法都没有定义所以会报错。另外比如一个简单的1 + 1并不是一个简单的数学运算,而是1.+(2),是执行了数字1的+方法,其中参数是2。那么在Ruby中,如何定义对实例变量的访问和变更呢?

class HelloWorld
  def initialize(myname = "Ruby")
    @name = myname
  end

  def name
    return @name
  end

  def name= (value)
    @name = value
  end

end
bob = HelloWorld.new("Jhon")
bob.name = "Bob"
puts bob.name

上面的 def name方法就相当于我们所知道的getter方法,def name=就是我们所知道的setter方法。但是如果实例变量太多,如果都这么定义岂不是很麻烦,所以Ruby为我们提供了简便定义的方法attr_reader,attr_writer,attr_accessor只要指定了变量名的符号,Ruby就会为我们定义响应的存储器。

定义 意义
attr_reader :name 只读(定义name方法)
attr_writeer :name 只写(定义name=方法)
attr_accessor:name 读写(定义以上连个方法)

所以上面的方法也可以定义为:

class HelloWorld
  def initialize(myname = "Ruby")
    @name = myname
  end

  # def name
  #     return @name
  # end

  # def name= (value)
  #     @name = value
  # end
  attr_accessor :name
end
bob = HelloWorld.new("Jhon")
bob.name = "Bob"
puts bob.name
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容