📜  Ruby getter 和 setter 方法(1)

📅  最后修改于: 2023-12-03 14:47:08.450000             🧑  作者: Mango

Ruby Getter 和 Setter 方法

在 Ruby 中,我们可以使用 getter 和 setter 方法来访问和设置对象的实例变量。这些方法使得我们可以封装对象的内部状态,并且可以有效地控制外部使用者对对象的访问。

Getter 方法

Getter 方法用来获取对象的实例变量的值,通常以 get_ 或者不加前缀的形式命名。在 Ruby 中,我们不需要显式地定义 Getter 方法,Ruby 会自动为每一个实例变量创建一个 Getter 方法。

例如,我们定义了一个 Person 类并创建了 name 实例变量:

class Person
  def initialize(name)
    @name = name
  end
end

person = Person.new('Alice')

我们可以通过以下方式访问 name 实例变量的值:

puts person.instance_variable_get('@name') # Alice
puts person.send(:name)                    # Alice
puts person.name                           # Alice

其中最后一行代码 person.name 就是使用了 Ruby 自动创建的 Getter 方法。

Setter 方法

Setter 方法用来设置对象的实例变量的值,通常以 set_ 或者不加前缀的形式命名。在 Ruby 中,我们同样不需要显式地定义 Setter 方法,Ruby 会自动为每一个实例变量创建一个 Setter 方法。

例如,我们给 Person 类添加一个 set_name 方法:

class Person
  def initialize(name)
    @name = name
  end

  def set_name(name)
    @name = name
  end
end

person = Person.new('Alice')
person.set_name('Bob')
puts person.instance_variable_get('@name') # Bob
puts person.send(:name=, 'Charlie')         # Charlie
puts person.name                           # Charlie

其中最后一行代码 person.name 就是使用了 Ruby 自动创建的 Setter 方法。

attr_accessor、attr_reader 和 attr_writer 方法

如果一个类有多个实例变量需要创建 Getter 和 Setter 方法,则这个工作变得十分耗时且繁琐。Ruby 提供了 attr_accessorattr_readerattr_writer 方法来快速定义 Getter 和 Setter 方法。

attr_accessor 方法可以同时创建 Getter 和 Setter 方法,例如:

class Person
  attr_accessor :name, :age
  def initialize(name, age)
    @name = name
    @age = age
  end
end

person = Person.new('Alice', 20)
puts person.name # Alice
puts person.age  # 20
person.name = 'Bob'
person.age = 25
puts person.name # Bob
puts person.age  # 25

attr_reader 方法可以创建 Getter 方法:

class Person
  attr_reader :name, :age
  def initialize(name, age)
    @name = name
    @age = age
  end
end

person = Person.new('Alice', 20)
puts person.name # Alice
puts person.age  # 20
person.name = 'Bob' # 会抛出 NoMethodError 异常
person.age = 25     # 会抛出 NoMethodError 异常

attr_writer 方法可以创建 Setter 方法:

class Person
  attr_writer :name, :age
  def initialize(name, age)
    @name = name
    @age = age
  end
end

person = Person.new('Alice', 20)
person.name = 'Bob'
person.age = 25
puts person.name # 会抛出 NoMethodError 异常
puts person.age  # 会抛出 NoMethodError 异常
总结

在 Ruby 中,Getter 和 Setter 方法允许我们封装对象的内部状态,并且可以有效地控制外部使用者对对象的访问。我们可以通过不加前缀、加 get_ 前缀、加 set_ 前缀、attr_accessorattr_readerattr_writer 方法定义这些方法。在实际使用中,我们通常使用 attr_accessorattr_readerattr_writer 方法来快速定义 Getter 和 Setter 方法,使得代码更加简洁易读。