Ruby 获取器和设置器方法

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中,有三种类型的访问器

  1. attr_reader : 这个访问器为给定的项目生成自动的 Getter 方法。
  2. attr_writer : 这个访问器为给定的项目生成自动的 Setter 方法。
  3. 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。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程