Ruby 获取器和设置器方法
在一个Ruby类中,我们可能想把实例变量(以@符号为前缀定义的变量)暴露给其他类进行封装。那么,在这种情况下,我们使用 getter和setter方法。 这些方法允许我们从类的外部访问类的实例变量。getter方法用于获取一个实例变量的值,而setter方法则用于设置某个类的实例变量的值。
例1: 简单的get方法
# 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
在这个例子中,如果我们不在类中定义网站方法,后面使用的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
在这个例子中,如果我们不在类中定义site=方法,那么我们就不能改变类的实例变量的值。在这个setter方法的帮助下,我们为多个网站重用了同一个对象。
在上面的例子中,我们可以看到,随着类的增长,我们可能会有许多getter和setter方法,其中大部分都遵循上面的格式。为了解决这些不断增长的代码行,Ruby为我们提供了一种快速生成getter和setter方法的方法,而不需要像上面的例子中那样明确地编写它们。这些方法被称为 访问器 方法。它们的目的与getter或setter的目的是一样的。
在Ruby中,有三种类型的访问器
- attr_reader : 这个访问器为给定的项目生成自动的 Getter 方法。
- attr_writer : 这个访问器为给定的项目生成自动的 Setter 方法。
- attr_accessor : 这个访问器为给定项目生成自动的 **Getter & Setter **方法。
- attr_reader: accessor get 方法
示例 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
这里我们用 Ruby 的方式替换了经典的 getter 方法来生成 getter 方法。输出仍然是一样的,因为attr_reader的功能与例子1中所示的一样。
- attr_writer: accessor set 方法
示例 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
在这里,我们用Ruby的方式替换了经典的getter和setter方法,来生成它们。
- 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。