Ruby 参数

在编程中,参数是将值传递给某个 方法,以便该方法能够使用这些值执行某些有用的操作(例如执行计算或打印消息)。

下面是 Ruby 参数的快速示例。您可以阅读本教程的其余部分以了解更多信息。

示例

def add_numbers(a, b)
  sum = a + b
  puts "Sum: #{sum}"
end

add_numbers(2, 3)

# Output:
# Sum: 5

这里,`add_numbers` 方法接收两个参数:23。这两个值相加,结果被打印出来。


带默认值的参数

在 Ruby 中,您可以使用 `=` 运算符为方法参数分配默认值。如果在调用时未提供值,Ruby 将使用默认值。例如,

def add_numbers(a = 7, b = 8)
  sum = a + b
  puts "Sum: #{sum}"
end

# Method call with two arguments
add_numbers(2, 3)

# Method call with one argument
add_numbers(2)

# Method call with no arguments
add_numbers

输出

Sum: 5
Sum: 10
Sum: 15

在上面的示例中,请注意方法定义

def add_numbers(a = 7, b = 8)
  ...
end

在这里,我们为参数 `a` 和 `b` 分别提供了默认值 78。此程序的工作方式如下:

1. add_numbers(2, 3)

方法调用时传递了两个值。因此,使用这些值而不是默认值。

2. add_numbers(2)

方法调用时只传递了一个值。值 2 被赋给参数 `a`,参数 `b` 使用默认值。

3. add_numbers()

方法调用时未传递任何值。因此,`a` 和 `b` 两个参数都使用默认值。


Ruby 关键字参数

Ruby 支持关键字参数,在调用方法时为每个参数显式命名。

这使得代码更易于阅读,并避免了对参数顺序的混淆。例如,

def display_info(first_name:, last_name:)
  puts "First Name: #{first_name}"
  puts "Last Name: #{last_name}"
end

display_info(last_name: "Cartman", first_name: "Eric")

输出

First Name: Eric
Last Name: Cartman

这里,`display_info` 方法接收两个关键字参数:`first_name` 和 `last_name`。

在调用方法时,您使用参数名传递参数。

这意味着顺序无关紧要;Ruby 根据名称匹配,而不是位置。

注意:如果在调用方法时忘记传递任何必需的关键字参数,Ruby 将引发 `ArgumentError`。为避免此问题,请始终传递所有必需的关键字参数。


任意参数

有时,您可能不知道会向方法传递多少参数。在这种情况下,Ruby 允许您使用任意参数。

您可以通过在参数名称前添加星号 (*) 来实现此目的。这将把所有额外的参数收集到一个数组中。例如,

# Program to find the sum of multiple numbers 

def find_sum(*numbers)
  result = 0
  numbers.each { |num| result += num }
  puts "Sum = #{result}"
end

# Method call with 3 arguments
find_sum(1, 2, 3)

# Method call with 2 arguments
find_sum(4, 9)

输出

Sum = 6
Sum = 13

在上面的示例中,我们创建了 `find_sum` 方法,该方法接受任意参数。请注意以下几行:

find_sum(1, 2, 3)

find_sum(4, 9)

在这里,我们可以用不同的参数调用同一个方法。

注意:在方法内部,`numbers` 被视为一个 数组,因此我们可以使用 `.each` 等数组方法来遍历值。


任意关键字参数

Ruby 还支持使用双星号 (**) 运算符的任意关键字参数。例如,

def print_info(**details)
  details.each do |key, value|
    puts "#{key}: #{value}"
  end
end

print_info(name: "Charlie", age: 30)

输出

name: Charlie
age: 30

这里,该方法使用 `**details` 接受任意数量的关键字参数。在方法内部,这些参数存储在一个哈希中,我们通过 `.each` 遍历它。


更多关于 Ruby 参数的信息

块参数

块参数允许方法接受一个代码块,然后可以在方法内部执行该代码块。Ruby 提供了两种处理块的方法:

1. 使用 yield

def greet(name)
  puts "Hello, #{name}"
  yield if block_given?
end

greet("Alice") { puts "Have a great day!" }

输出

Hello, Alice
Have a great day!

这里,在调用方法时传递了块,并使用 `yield` 执行。该方法使用 `block_given?` 检查是否存在块,以避免错误。

2. 使用 &block

def greet(name, &block)
  puts "Hello, #{name}"
  block.call if block
end

greet("Bob") { puts "Welcome!" }

输出

Hello, Bob
Welcome!

这里,块被接收为一个名为 `block` 的变量,并使用 `block.call` 调用。

要了解有关块的更多信息,请访问 Ruby 块

混合参数类型

Ruby 允许您在单个方法中混合各种类型的参数。例如,

def introduce(name, age = 18, city:, country: "Nepal")
  puts "Name: #{name}"
  puts "Age: #{age}"
  puts "City: #{city}"
  puts "Country: #{country}"
end

introduce("Ruby", city: "Kathmandu")

输出

Name: Ruby
Age: 18
City: Kathmandu
Country: Nepal
参数顺序规则

Ruby 在定义方法参数时强制执行严格的顺序。您不能随意混合它们。

必需的顺序是:

  1. 必需的位置参数
  2. 可选/默认位置参数
  3. 任意参数 (*args)
  4. 必需的关键字参数
  5. 带默认值的关键字参数
  6. 任意关键字参数 (**kwargs)
  7. 块参数 (&block)
无效的参数混合

如果您以错误的顺序混合参数类型,Ruby 将引发 `SyntaxError`。例如,

# Invalid: keyword argument before *args
def wrong_order(name:, *args)
end

始终遵循正确的顺序来安全清晰地定义方法参数。

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战