ruby 中的属性访问器-ag捕鱼王app官网

ruby 中的属性访问器

作者:迹忆客 最近更新:2023/03/21 浏览次数:

attr_accessor 是 ruby oop 设计中 attr_readerattr_writer 的快捷方式。

因此,要了解 attr_accessor,你必须首先了解 attr_readerattr_writer 是如何工作的。为了说明这些是如何工作的,我们将创建一个简单的类。

在 ruby 中使用简单类创建实例变量 full_name

class employee
  def initialize(last_name, first_name)
    @full_name = "#{last_name}#{first_name}"
  end
end
employee1 = employee.new("john", "doe")
puts employee1.full_name

输出:

undefined method 'full_name' for # (nomethoderror)

上面的简单 employee 类有一个构造函数,它接受员工的姓氏和名字,并使用它来创建实例变量 full_name

如果我们创建这个类的一个实例并读取 full_name,我们会收到 nomethoderror 错误,如上面的输出所示。我们将需要创建另一个返回实例变量的方法。

class employee
  def initialize(last_name, first_name)
    @full_name = "#{last_name}#{first_name}"
  end
  def full_name
    @full_name
  end
end
employee1 = employee.new("john", "doe")
puts employee1.full_name

输出:

john doe

在 ruby 中使用 attr_reader 来读取多个实例变量

这是否意味着如果我们有多个需要读取的实例变量,我们将不得不为每个变量创建一个方法?

那会使我们的课不必要地长。因此,ruby 为我们提供了 attr_reader 来实现这一点。

class employee
  attr_reader :full_name
  def initialize(last_name, first_name)
    @full_name = "#{last_name}#{first_name}"
  end
end
employee1 = employee.new("john", "doe")
puts employee1.full_name

输出:

john doe

正如你在上面的代码中看到的,我们的输出与前面的代码相同。attr_reader :full_name 的添加在底层添加了 full_name 方法,允许我们编写一个简洁的类。

假设我们还需要重置实例变量。我们可能会尝试这样的事情:

class employee
  attr_reader :full_name
  def initialize(last_name, first_name)
    @full_name = "#{last_name}#{first_name}"
  end
end
employee1 = employee.new("john", "doe")
# after doing some operation on employee1 and we need
# to rename the full name
employee1.full_name = "nicolas daniel"

输出:

undefined method 'full_name=' for # (nomethoderror)

一种方法是定义一个重置实例变量的 full_name= setter 方法。

class employee
  attr_reader :full_name
  def initialize(last_name, first_name)
    @full_name = "#{last_name}#{first_name}"
  end
  def full_name=(name)
    @full_name = name
  end
end
employee1 = employee.new("john", "doe")
# after doing some operation on employee1 and we need
# to rename the full name
employee1.full_name = "nicolas daniel"
puts employee1.full_name

输出:

nicolas daniel

在 ruby 中使用 attr_writer 编写多个实例变量

ruby 并没有像我们在这里所做的那样定义一个单独的 setter 方法,而是为我们提供了可以帮助我们的 attr_writer

class employee
  attr_reader :full_name
  attr_writer :full_name
  def initialize(last_name, first_name)
    @full_name = "#{last_name}#{first_name}"
  end
end
employee1 = employee.new("john", "doe")
# after doing some operation on employee1 and we need
# to rename the full name
employee1.full_name = "nicolas daniel"
puts employee1.full_name

输出:

nicolas daniel

正如我们在上面的输出中所看到的,即使我们删除了之前定义的 setter 方法,添加 attr_writer 也得到了相同的结果。

在 ruby 中将 attr_readerattr_writer 组合成 attr_accessor

我们的最终代码比为每个实例变量定义 getter 和 setter 方法要好得多,但是 ruby 仍然允许我们通过将 attr_readerattr_writer 组合到 attr_accessor 中更进一步。

class employee
  attr_accessor :full_name
  def initialize(last_name, first_name)
    @full_name = "#{last_name}#{first_name}"
  end
end
employee1 = employee.new("john", "doe")
# after doing some operation on employee1 and we need
# to rename the full name
employee1.full_name = "nicolas daniel"
puts employee1.full_name

输出:

nicolas daniel

正如我们在上面看到的,使用 attr_accessor,我们会自动为实例变量创建一个 getter 和一个 setter。

上一篇:

下一篇:

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

发布时间:2024/02/05 浏览次数:181 分类:编程语言

本文演示了 ruby 中注入方法的不同用途。

发布时间:2023/03/21 浏览次数:240 分类:编程语言

本文介绍了在 ruby 程序中调用 shell 命令的各种方法。

发布时间:2023/03/21 浏览次数:86 分类:编程语言

简要讨论 ruby 中的模式匹配运算符及其使用方式。

发布时间:2023/03/21 浏览次数:89 分类:编程语言

本教程说明了如何在 ruby 中使用安全导航。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便
网站地图