📜  Ruby getter 和 setter 方法

📅  最后修改于: 2022-05-13 01:54:40.289000             🧑  作者: Mango

Ruby getter 和 setter 方法

在 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

在这个例子中,如果我们没有在类中定义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 中有三种类型的访问器

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