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
十、总结 #
本章我们学习了:
- 位置参数:按顺序传递
- 默认参数:提供默认值
- 关键字参数:按名称传递
- 可变参数:*args、**kwargs
- 参数解构:数组、嵌套解构
- 参数转发:…语法
接下来让我们学习Ruby的返回值!
最后更新:2026-03-27