ruby 中的属性访问器
attr_accessor
是 ruby oop 设计中 attr_reader
和 attr_writer
的快捷方式。
因此,要了解 attr_accessor
,你必须首先了解 attr_reader
和 attr_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_reader
和 attr_writer
组合成 attr_accessor
我们的最终代码比为每个实例变量定义 getter 和 setter 方法要好得多,但是 ruby 仍然允许我们通过将 attr_reader
和 attr_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 中使用安全导航。