Ruby getter 和 setter 方法
在 Ruby 类中,我们可能希望将实例变量(以 @ 符号作为前缀定义的变量)公开给其他类以进行封装。然后,在这种情况下,我们使用getter 和 setter 方法。这些方法允许我们从类外部访问类的实例变量。 Getter 方法用于获取实例变量的值,而 setter 方法用于设置某个类的实例变量的值。
# Ruby Program of getter method
class CSWebsite
# Constructor to initialize
# the class with a name
# instance variable
def initialize(website)
@website = website
end
# Classical get method
def website
@website
end
end
# Creating an object of the class
gfg = CSWebsite.new "www.geeksforgeeks.org"
puts gfg.website
输出 :
www.geeksforgeeks.org
在这个例子中,如果我们没有在类中定义website方法,那么后面使用的 puts 语句(gfg.website)会给我们一个异常,因为@website变量是类的实例变量,它不应该在默认类。
示例 2:简单集合方法
# Ruby Program of setter method
class CSWebsite
# Constructor to initialize
# the class with a name
# instance variable
def initialize(website)
@website = website
end
# Classical get method
def website
@website
end
# Classical set method
def website=(website)
@website = website
end
end
# Creating an object of the class
gfg = CSWebsite.new "www.geeksforgeeks.org"
puts gfg.website
# Change the instance variable from
# Outside the class
gfg.website="www.practice.geeksforgeeks.org"
puts gfg.website
输出 :
www.geeksforgeeks.org
www.practice.geeksforgeeks.org
在这个例子中,如果我们没有在类中定义website=方法,那么我们就不能改变类的实例变量的值。在这个 setter 方法的帮助下,我们为多个网站重用了同一个对象。
在上面的示例中,我们可以看到随着类的增长,我们可能有许多 getter 和 setter 方法,其中大多数遵循与上面所示相同的格式。为了修复这些不断增长的代码行,Ruby 为我们提供了一种快速生成 getter 和 setter 方法的方法,而无需像上面示例中那样显式编写它们。这些方法称为访问器方法。它们的目的与 getter 或 setter 的目的相同。
Ruby 中有三种类型的访问器
- attr_reader :此访问器为给定项目生成自动Getter方法。
- attr_writer :此访问器为给定项目生成自动Setter方法。
- attr_accessor :此访问器为给定项目生成自动Getter 和 Setter方法。
- attr_reader:访问器获取方法
示例 3:# Ruby Program of accessor getter method class CSWebsite # Constructor to initialize # the class with a name # instance variable def initialize(website) @website = website end # accessor get method attr_reader :website end # Creating an object of the class gfg = CSWebsite.new "www.geeksforgeeks.org" puts gfg.website
输出 :
www.geeksforgeeks.org
这里我们将经典的getter方法替换为Ruby的生成getter方法的方式。输出保持不变,因为attr_reader具有与示例 1 中所示相同的函数。
- attr_writer:访问器设置方法
示例 4:# Ruby Program of accessor getter and setter method class CSWebsite # Constructor to initialize # the class with a name # instance variable def initialize(website) @website = website end # accessor get method attr_reader :website # accessor set method attr_writer :website end # Creating an object of the class gfg = CSWebsite.new "www.geeksforgeeks.org" puts gfg.website # Change the instance variable from # Outside the class gfg.website="www.practice.geeksforgeeks.org" puts gfg.website
输出 :
www.geeksforgeeks.org www.practice.geeksforgeeks.org
在这里,我们将经典的 getter 和 setter 方法替换为 Ruby 的生成方式。
- attr_accessor:访问器获取和设置方法
示例 5:# Ruby Program of accessor getter and setter method class CSWebsite # Constructor to initialize # the class with a name # instance variable def initialize(website) @website = website end # accessor get and set method attr_accessor :website end # Creating an object of the class gfg = CSWebsite.new "www.geeksforgeeks.org" puts gfg.website # Change the instance variable from # Outside the class gfg.website="www.practice.geeksforgeeks.org" puts gfg.website
输出 :
www.geeksforgeeks.org www.practice.geeksforgeeks.org
在这里,两个访问器都被一个attr_accessor替换,因为它既可以用作getter ,也可以用作setter 。
- 访问器的混合使用:
一个类可能有许多实例变量,基于这些变量我们可能希望这些实例变量对其他类具有不同的访问权限。在这里,我们看到了类中访问器的混合使用。
示例 6:# Ruby Program of accessor getter and setter method class CSWebsite # Constructor to initialize # the class with a name # instance variable def initialize(website, id) @website = website @id = id end # accessor get and set method attr_accessor :website attr_reader :id end # Creating an object of the class gfg = CSWebsite.new "www.geeksforgeeks.org", 12 puts gfg.website puts gfg.id
输出 :
www.geeksforgeeks.org 12
此处的id实例变量仅使用attr_reader获得 get 方法,因为我们不希望其他类在初始化后更改其 id。