Ruby方法参数 #

一、参数概述 #

Ruby支持多种参数形式,让方法调用更加灵活。

参数类型 描述 示例
位置参数 按位置传递 def foo(a, b)
默认参数 提供默认值 def foo(a = 1)
关键字参数 按名称传递 def foo(a:)
可变参数 接收多个值 def foo(*args)

二、位置参数 #

2.1 基本用法 #

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

greet("Ruby", "Hello")
greet("Ruby", "Hi")

2.2 参数顺序 #

ruby
def create_user(name, age, city)
  { name: name, age: age, city: city }
end

create_user("Ruby", 30, "Beijing")

2.3 参数数量 #

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

add(1, 2)
add(1)
add(1, 2, 3)

三、默认参数 #

3.1 基本用法 #

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

greet("Ruby")
greet("Ruby", "Hi")

3.2 多个默认参数 #

ruby
def create_user(name, age = 18, city = "Beijing")
  { name: name, age: age, city: city }
end

create_user("Ruby")
create_user("Ruby", 25)
create_user("Ruby", 25, "Shanghai")

3.3 默认参数顺序 #

ruby
def example(a, b = 2, c)
  [a, b, c]
end

example(1, 3)
example(1, 2, 3)

3.4 动态默认值 #

ruby
def log(message, timestamp = Time.now)
  "[#{timestamp}] #{message}"
end

log("Hello")
sleep 1
log("World")

四、关键字参数 #

4.1 基本用法 #

ruby
def greet(name:, greeting:)
  "#{greeting}, #{name}!"
end

greet(name: "Ruby", greeting: "Hello")
greet(greeting: "Hi", name: "Ruby")

4.2 默认值 #

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

greet(name: "Ruby")
greet(name: "Ruby", greeting: "Hi")

4.3 必需关键字参数 #

ruby
def create_user(name:, age:)
  { name: name, age: age }
end

create_user(name: "Ruby", age: 30)
create_user(name: "Ruby")

4.4 混合参数 #

ruby
def create_user(name, age:, city: "Beijing")
  { name: name, age: age, city: city }
end

create_user("Ruby", age: 30)
create_user("Ruby", age: 30, city: "Shanghai")

五、可变参数 #

5.1 基本用法 #

ruby
def sum(*numbers)
  numbers.sum
end

sum(1, 2, 3)
sum(1, 2, 3, 4, 5)
sum()

5.2 混合位置参数 #

ruby
def greet(greeting, *names)
  names.map { |name| "#{greeting}, #{name}!" }
end

greet("Hello", "Ruby", "Rails", "Sinatra")

5.3 参数解构 #

ruby
def print_pair(a, b)
  puts "#{a}, #{b}"
end

pair = [1, 2]
print_pair(*pair)

5.4 双星号参数 #

ruby
def create_user(name, **options)
  { name: name }.merge(options)
end

create_user("Ruby", age: 30, city: "Beijing")
create_user("Rails", age: 25, active: true)

5.5 捕获剩余关键字参数 #

ruby
def process(options)
  puts "Options: #{options}"
end

process(a: 1, b: 2, c: 3)

六、参数解构 #

6.1 数组解构 #

ruby
def print_coordinates((x, y))
  puts "x: #{x}, y: #{y}"
end

print_coordinates([10, 20])
print_coordinates([10, 20, 30])

6.2 嵌套解构 #

ruby
def process((a, (b, c)))
  puts "a: #{a}, b: #{b}, c: #{c}"
end

process([1, [2, 3]])

6.3 块参数解构 #

ruby
[[1, 2], [3, 4]].each do |(a, b)|
  puts "#{a} + #{b} = #{a + b}"
end

七、参数转发 #

7.1 … 语法(Ruby 2.7+) #

ruby
def wrapper(...)
  original_method(...)
end

def original_method(a, b, c)
  a + b + c
end

def wrapper(...)
  puts "Before"
  result = original_method(...)
  puts "After"
  result
end

wrapper(1, 2, 3)

7.2 委托 #

ruby
require 'forwardable'

class Queue
  extend Forwardable

  def initialize
    @queue = []
  end

  def_delegators :@queue, :push, :pop, :empty?, :size
end

queue = Queue.new
queue.push(1)
queue.pop

八、实用示例 #

8.1 配置方法 #

ruby
def configure(host:, port: 3000, timeout: 30, **options)
  config = {
    host: host,
    port: port,
    timeout: timeout
  }.merge(options)

  puts "Configuration: #{config}"
end

configure(host: "localhost")
configure(host: "example.com", port: 8080, ssl: true)

8.2 构建器模式 #

ruby
class QueryBuilder
  def initialize(table)
    @table = table
    @conditions = []
    @order = nil
    @limit = nil
  end

  def where(**conditions)
    @conditions << conditions
    self
  end

  def order(column, direction = :asc)
    @order = { column: column, direction: direction }
    self
  end

  def limit(n)
    @limit = n
    self
  end

  def to_sql
    sql = "SELECT * FROM #{@table}"
    sql += " WHERE #{@conditions.map { |c| c.map { |k, v| "#{k} = #{v}" }.join(" AND ") }.join(" AND ")}" if @conditions.any?
    sql += " ORDER BY #{@order[:column]} #{@order[:direction]}" if @order
    sql += " LIMIT #{@limit}" if @limit
    sql
  end
end

query = QueryBuilder.new("users")
  .where(active: true)
  .where(role: "admin")
  .order(:created_at, :desc)
  .limit(10)

query.to_sql

8.3 选项处理 #

ruby
def process(data, validate: true, transform: true, save: false)
  data = validate_data(data) if validate
  data = transform_data(data) if transform
  save_data(data) if save
  data
end

process([1, 2, 3])
process([1, 2, 3], validate: false)
process([1, 2, 3], save: true)

九、最佳实践 #

9.1 参数顺序 #

ruby
def create_user(name, age, city = "Beijing", **options)
end

def create_user(name:, age:, city: "Beijing", **options)
end

9.2 使用关键字参数提高可读性 #

ruby
create_user("Ruby", 30, "Beijing", true, false)

create_user(
  name: "Ruby",
  age: 30,
  city: "Beijing",
  active: true,
  admin: false
)

9.3 参数数量限制 #

ruby
def process(a, b, c, d, e, f)
end

def process(options)
  a = options[:a]
  b = options[:b]
end

def process(a:, b:, c:, d:, e:, f:)
end

十、总结 #

本章我们学习了:

  1. 位置参数:按顺序传递
  2. 默认参数:提供默认值
  3. 关键字参数:按名称传递
  4. 可变参数:*args、**kwargs
  5. 参数解构:数组、嵌套解构
  6. 参数转发:…语法

接下来让我们学习Ruby的返回值!

最后更新:2026-03-27