Ruby方法定义 #

一、方法概述 #

方法是Ruby中组织代码的基本单元,用于封装可重用的代码块。

二、定义方法 #

2.1 基本语法 #

ruby
def greet
  puts "Hello, Ruby!"
end

greet

2.2 带参数的方法 #

ruby
def greet(name)
  puts "Hello, #{name}!"
end

greet("Ruby")
greet "Ruby"

2.3 多参数方法 #

ruby
def add(a, b)
  a + b
end

add(1, 2)
add 1, 2

2.4 返回值 #

ruby
def add(a, b)
  return a + b
end

def add(a, b)
  a + b
end

def add(a, b)
  result = a + b
  result
end

2.5 多返回值 #

ruby
def min_max(arr)
  [arr.min, arr.max]
end

min, max = min_max([3, 1, 4, 1, 5, 9])

三、方法命名 #

3.1 命名规则 #

ruby
def valid_name
end

def valid_name?
end

def dangerous_method!
end

def setter=(value)
end

def _private_method
end

3.2 后缀含义 #

后缀 含义 示例
? 谓词方法,返回布尔值 empty?
! 危险方法,修改原对象 sort!
= 赋值方法 name=
ruby
def even?(n)
  n % 2 == 0
end

def sort!(arr)
  arr.sort!
end

def name=(value)
  @name = value
end

四、方法调用 #

4.1 基本调用 #

ruby
greet
greet()
greet("Ruby")
greet "Ruby"

4.2 链式调用 #

ruby
"hello".upcase.reverse
[1, 2, 3].map(&:to_s).join("-")

4.3 安全调用 #

ruby
user&.name
user&.profile&.avatar

4.4 send调用 #

ruby
"hello".send(:upcase)
"hello".send(:+, " world")
"hello".public_send(:upcase)

五、方法对象 #

5.1 method方法 #

ruby
method(:puts)
method(:puts).call("Hello")
method(:puts)["Hello"]

5.2 to_proc #

ruby
:upcase.to_proc
["a", "b", "c"].map(&:upcase)

5.3 方法作为参数 #

ruby
def apply(value, func)
  func.call(value)
end

apply("hello", method(:upcase))
apply("hello", ->(s) { s.reverse })

六、方法可见性 #

6.1 public #

ruby
class Person
  def greet
    "Hello!"
  end
end

Person.new.greet

6.2 private #

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

  def introduce
    "Hello, I'm #{name}"
  end

  private

  def name
    @name
  end
end

person = Person.new("Ruby")
person.introduce
person.name

6.3 protected #

ruby
class Person
  def initialize(age)
    @age = age
  end

  def older_than?(other)
    age > other.age
  end

  protected

  def age
    @age
  end
end

alice = Person.new(30)
bob = Person.new(25)
alice.older_than?(bob)

七、类方法 #

7.1 定义类方法 #

ruby
class Person
  def self.create(name)
    Person.new(name)
  end

  class << self
    def count
      @@count
    end
  end
end

Person.create("Ruby")

7.2 调用类方法 #

ruby
Person.create("Ruby")
Person::create("Ruby")

八、实用示例 #

8.1 工具方法 #

ruby
def present?(value)
  !value.nil? && value != "" && value != []
end

def blank?(value)
  !present?(value)
end

def presence(value)
  value if present?(value)
end

8.2 验证方法 #

ruby
def valid_email?(email)
  email.match?(/\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i)
end

def valid_phone?(phone)
  phone.match?(/\A\d{11}\z/)
end

8.3 转换方法 #

ruby
def to_boolean(value)
  case value
  when true, "true", "1", 1 then true
  when false, "false", "0", 0 then false
  else nil
  end
end

def to_snake_case(str)
  str.gsub(/([A-Z])/, '_\1').downcase.gsub(/^_/, '')
end

def to_camel_case(str)
  str.split('_').map(&:capitalize).join
end

8.4 缓存方法 #

ruby
def memoize(name)
  define_method(name) do |*args|
    cache = instance_variable_get("@_#{name}_cache") || {}
    instance_variable_set("@_#{name}_cache", cache)
    cache[args] ||= super(*args)
  end
end

九、最佳实践 #

9.1 方法长度 #

ruby
def process(data)
  return unless valid?(data)
  
  transformed = transform(data)
  saved = save(transformed)
  notify(saved)
end

def valid?(data)
  data && !data.empty?
end

def transform(data)
  data.map(&:upcase)
end

9.2 单一职责 #

ruby
def create_user(params)
  user = build_user(params)
  validate_user(user)
  save_user(user)
  send_welcome_email(user)
  user
end

9.3 有意义的命名 #

ruby
def calculate_total_price(items)
  items.sum { |item| item.price * item.quantity }
end

def apply_discount(total, discount_percent)
  total * (1 - discount_percent / 100.0)
end

十、总结 #

本章我们学习了:

  1. 定义方法:def关键字、参数、返回值
  2. 方法命名:规则、后缀含义
  3. 方法调用:基本调用、链式调用、安全调用
  4. 方法对象:method、to_proc
  5. 方法可见性:public、private、protected
  6. 类方法:self、class << self

接下来让我们学习Ruby的方法参数!

最后更新:2026-03-27