Ruby 中的 attr_accessor 是什么? [英] What is attr_accessor in Ruby?

查看:64
本文介绍了Ruby 中的 attr_accessor 是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很难理解 Ruby 中的 attr_accessor.
有人可以向我解释一下吗?

I am having a hard time understanding attr_accessor in Ruby.
Can someone explain this to me?

推荐答案

假设您有一个 Person 类.

class Person
end

person = Person.new
person.name # => no method error

显然我们从未定义方法name.让我们这样做.

Obviously we never defined method name. Let's do that.

class Person
  def name
    @name # simply returning an instance variable @name
  end
end

person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error

啊哈,我们可以读取名称,但这并不意味着我们可以分配名称.这是两种不同的方法.前者称为reader,后者称为writer.我们还没有创建作家,所以让我们来做吧.

Aha, we can read the name, but that doesn't mean we can assign the name. Those are two different methods. The former is called reader and latter is called writer. We didn't create the writer yet so let's do that.

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"

棒极了.现在我们可以使用 reader 和 writer 方法写入和读取实例变量 @name.除了如此频繁地这样做之外,为什么每次都浪费时间编写这些方法?我们可以更轻松.

Awesome. Now we can write and read instance variable @name using reader and writer methods. Except, this is done so frequently, why waste time writing these methods every time? We can do it easier.

class Person
  attr_reader :name
  attr_writer :name
end

即使这样也会重复.当您想要读取器和写入器时,只需使用访问器!

Even this can get repetitive. When you want both reader and writer just use accessor!

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Dennis"
person.name # => "Dennis"

以同样的方式工作!猜猜看:我们 person 对象中的实例变量 @name 将像我们手动设置时一样设置,因此您可以在其他方法中使用它.

Works the same way! And guess what: the instance variable @name in our person object will be set just like when we did it manually, so you can use it in other methods.

class Person
  attr_accessor :name

  def greeting
    "Hello #{@name}"
  end
end

person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"

就是这样.为了了解 attr_readerattr_writerattr_accessor 方法如何实际为您生成方法,请阅读其他答案、书籍、ruby 文档.

That's it. In order to understand how attr_reader, attr_writer, and attr_accessor methods actually generate methods for you, read other answers, books, ruby docs.

这篇关于Ruby 中的 attr_accessor 是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆