Ruby self 关键字
最后修改日期:2025 年 4 月 27 日
本教程讲解如何使用 Ruby 的 self 关键字。self 关键字是 Ruby 面向对象特性的基础。
self 关键字引用当前对象,即方法调用的默认接收者。它会根据在代码中的使用位置改变上下文。
理解 self 对于编写惯用的 Ruby 代码至关重要。它影响方法定义、类方法和实例变量访问。
实例方法中的基本 self
在实例方法中,self 引用类的实例。此示例展示了如何使用 self 访问实例变量。
class Person
def initialize(name)
@name = name
end
def introduce
puts "Hello, my name is #{self.name}"
end
def name
@name
end
end
person = Person.new("Alice")
person.introduce
这里的 self.name 调用当前实例的 name getter 方法。self 关键字明确了我们正在调用一个方法。
类方法中的 self
在类方法定义中,self 引用类本身。这是 Ruby 定义类级别方法的方式。
class Logger
def self.info(message)
puts "[INFO] #{message}"
end
def self.error(message)
puts "[ERROR] #{message}"
end
end
Logger.info("Application started")
Logger.error("Something went wrong")
self. 前缀在类本身上定义方法,而不是在实例上。这些方法直接在类上调用。
用于方法链式调用的 self
从方法中返回 self 可以实现方法链式调用。这创建了一个流畅的接口,可以按顺序调用方法。
class Calculator
def initialize(value = 0)
@value = value
end
def add(num)
@value += num
self
end
def subtract(num)
@value -= num
self
end
def result
@value
end
end
calc = Calculator.new
puts calc.add(5).subtract(2).add(10).result
每个方法都返回 self,从而可以链式调用。最后的 result 调用返回计算出的值。
模块定义中的 self
在模块内部,self 引用模块本身。这用于定义模块级别的方法和常量。
module MathUtils
def self.square(x)
x * x
end
def self.cube(x)
x * x * x
end
end
puts MathUtils.square(5)
puts MathUtils.cube(3)
使用 self 定义的模块方法直接在模块上调用。它们不需要将模块混入类中。
用于显式接收者的 self
使用 self 作为显式接收者可以使方法调用更清晰,并区分局部变量和方法调用。
class BankAccount
attr_accessor :balance
def initialize(balance = 0)
@balance = balance
end
def deposit(amount)
self.balance += amount
end
def withdraw(amount)
self.balance -= amount
end
end
account = BankAccount.new(100)
account.deposit(50)
account.withdraw(30)
puts account.balance
这里的 self.balance 调用 setter 方法,而单独的 balance 会引用一个局部变量。显式接收者避免了歧义。
单例方法中的 self
self 用于为单个对象定义单例方法。这些方法仅对该特定实例存在。
greeting = "Hello, world"
def greeting.shout
self.upcase + "!"
end
puts greeting.shout
puts greeting.upcase
begin
"Another string".shout
rescue => e
puts "Error: #{e.message}"
end
shout 方法仅在 greeting 对象上可用。其他字符串没有此方法,错误显示了这一点。
类定义中的 self
在类定义内部但在方法外部,self 引用正在定义的类。这用于元编程。
class Animal
puts "In Animal class definition, self is #{self}"
def self.species
puts "Species method called on #{self}"
end
def initialize
puts "In instance method, self is #{self}"
end
end
Animal.species
animal = Animal.new
输出显示了 self 如何改变上下文。在类定义内部,它是类本身;而在实例方法中,它是实例。
来源
本教程通过实例方法、类方法、方法链式调用等实际示例,涵盖了 Ruby 的 self 关键字。
作者
列出 所有 Ruby 教程。