📅  最后修改于: 2023-12-03 14:47:08.450000             🧑  作者: Mango
在 Ruby 中,我们可以使用 getter 和 setter 方法来访问和设置对象的实例变量。这些方法使得我们可以封装对象的内部状态,并且可以有效地控制外部使用者对对象的访问。
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 方法用来设置对象的实例变量的值,通常以 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 方法。
如果一个类有多个实例变量需要创建 Getter 和 Setter 方法,则这个工作变得十分耗时且繁琐。Ruby 提供了 attr_accessor
、attr_reader
和 attr_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_accessor
、attr_reader
和 attr_writer
方法定义这些方法。在实际使用中,我们通常使用 attr_accessor
、attr_reader
和 attr_writer
方法来快速定义 Getter 和 Setter 方法,使得代码更加简洁易读。