Ruby 私有方法
最后修改日期:2025 年 4 月 27 日
本教程解释了如何使用 Ruby 的 private
方法修饰符。私有方法是 Ruby 面向对象编程的重要组成部分。
private
关键字使方法只能在类内部访问。它们不能通过显式接收者调用,只能调用当前对象(self)。
私有方法通过隐藏实现细节来强制封装。它们有助于创建清晰的接口并防止滥用类内部的功能。
基本私有方法示例
这个简单的例子演示了 Ruby 中私有方法的基本用法。私有方法只能在类定义内部调用。
class Person def greet puts "Hello, #{name}" end private def name "John Doe" end end person = Person.new person.greet # person.name # This would raise NoMethodError
name
方法是私有的,只能在内部调用。尝试在实例上直接调用它会引发 NoMethodError。
私有方法调用约定
私有方法只能在没有显式接收者的情况下调用。它们必须在隐式的 self 上调用,或者从其他方法内部调用。
class Calculator def add(a, b) validate(a) validate(b) a + b end private def validate(num) raise "Not a number" unless num.is_a?(Numeric) end end calc = Calculator.new puts calc.add(5, 3) # calc.validate(5) # This would raise NoMethodError
validate
方法是私有的,由 add
在内部使用。不能在 Calculator 实例上直接调用它。
私有类方法
要使类方法私有,我们需要使用 private_class_method
方法或在 class << self
块内定义它们。
class Logger def self.log(message) format_message(message) end private_class_method def self.format_message(msg) "[#{Time.now}] #{msg}" end end puts Logger.log("Test message") # Logger.format_message("Test") # This would raise NoMethodError
format_message
类方法是私有的,只能由其他类方法在内部调用。
继承中的私有方法
私有方法会被子类继承,但仍然保持私有。子类方法可以调用它们,但不能直接在实例上调用。
class Animal def speak make_sound end private def make_sound "Generic animal noise" end end class Dog < Animal def bark make_sound + " - Woof!" end end dog = Dog.new puts dog.bark # dog.make_sound # This would raise NoMethodError
Dog 类从 Animal 继承了私有的 make_sound
方法。它可以内部调用它,但不能直接暴露它。
使用 send 的私有方法
Ruby 的 send
方法可以绕过私有方法限制。这应该谨慎使用,因为它会破坏封装。
class Secret private def hidden_method "Top secret information" end end secret = Secret.new # puts secret.hidden_method # Would raise NoMethodError puts secret.send(:hidden_method)
虽然 send
可以访问私有方法,但这通常被认为是不好的做法。它只应在测试等特殊情况下使用。
模块中的私有方法
模块可以定义私有方法,当它们被包含在类中时,这些方法会变为私有。这对于创建可重用的私有功能很有用。
module Validations def validate_presence(value) raise "Cannot be blank" if value.nil? || value.empty? end private :validate_presence end class User include Validations def save(name) validate_presence(name) puts "User saved" end end user = User.new user.save("John") # user.validate_presence("") # This would raise NoMethodError
validate_presence
方法在模块中是私有的,并且在包含在 User 类中时保持私有。
私有设置器方法
设置器方法(以 = 结尾)必须显式设置为私有,因为默认情况下它们不能在没有接收者的情况下调用。
class BankAccount def initialize(balance) self.balance = balance end def deposit(amount) self.balance += amount end private attr_reader :balance attr_writer :balance end account = BankAccount.new(100) account.deposit(50) # account.balance = 200 # This would raise NoMethodError
balance 设置器被设为私有,同时仍然可以在类内部使用。读取器也是私有的,以完全封装 balance 属性。
来源
本教程涵盖了 Ruby 的私有方法,并提供了实际示例,展示了它们在类、模块、继承和特殊情况下的用法。
作者
列出 所有 Ruby 教程。