Ruby 属性访问器 attr_accessor
实例变量属于对象内部。外部代码不能直接访问 @name,通常要通过方法读取或修改。
手写 reader
class User
def initialize(name)
@name = name
end
def name
@name
end
end
user = User.new("Alice")
puts user.name
name 方法返回 @name,这就是 reader。
手写 writer
class User
def name=(value)
@name = value
end
end
调用时看起来像赋值:
user.name = "Bob"
实际是在调用 name= 方法。
attr_reader、attr_writer、attr_accessor
Ruby 提供简写:
class User
attr_reader :name
attr_writer :password
attr_accessor :email
def initialize(name, email)
@name = name
@email = email
end
end
含义:
attr_reader:生成读取方法。attr_writer:生成写入方法。attr_accessor:同时生成读取和写入方法。
不要无脑暴露所有属性
class Account
attr_reader :balance
def initialize
@balance = 0
end
def deposit(amount)
@balance += amount
end
end
余额可以读,但不应该允许外部随意写:
# account.balance = -999 不应该允许
这就是封装的意义。
小练习
- 定义
Book类,使用attr_reader暴露title。 - 定义
User类,使用attr_accessor暴露email。 - 思考
Account#balance为什么更适合只读。
小结
访问器是方法,不是直接暴露变量。attr_accessor 很方便,但你应该只暴露外部真正需要访问或修改的状态。