📜  Ruby-块(1)

📅  最后修改于: 2023-12-03 14:47:09.795000             🧑  作者: Mango

Ruby-块

在 Ruby 中,块(block)是一段在调用方法时可传递的代码,类似于匿名函数或 Lambda 表达式。块通常由大括号或 do/end 包含,可以在方法调用时被传递并执行。

语法

使用大括号 {}do/end 包含一个代码块,并将其传递给方法:

[1, 2, 3].each { |num| puts num }
# 等同于
[1, 2, 3].each do |num|
  puts num
end

代码块的参数(在 | 中定义)是可选的,也可以定义多个参数:

[1, 2, 3].map { |num| num * 2 } # => [2, 4, 6]
[1, 2, 3].each_with_index { |num, index| puts "#{index}: #{num}" }
# 输出:
# 0: 1
# 1: 2
# 2: 3

如果方法调用的最后一个参数是一个块,可以直接将其放在方法调用括号的外面:

[1, 2, 3].each do |num|
  puts num
end

# 等同于

[1, 2, 3].each { |num|
  puts num
}
使用块的方法

许多 Ruby 方法接受块参数作为它们的执行内容,例如 eachmapreduce。这些方法将块应用到每个元素上,并根据块的执行结果进行相应的操作:

[1, 2, 3].each { |num| puts num }
# 输出:
# 1
# 2
# 3

["foo", "bar", "baz"].map { |str| str.upcase }
# => ["FOO", "BAR", "BAZ"]

[1, 2, 3].reduce(0) { |sum, num| sum + num }
# => 6
块的返回值

块的执行结果是最后一个表达式的值。可以使用 return 关键字来显式返回一个值:

def includes_2?(nums)
  nums.each do |num|
    return true if num == 2
  end
  false
end

includes_2?([1, 2, 3]) # => true
includes_2?([4, 5, 6]) # => false
方法和块的结合

Ruby 方法通常用于处理集合中的元素,可以通过块传递一些自定义逻辑进行自定义处理。例如,可以使用 select 方法来从集合中选择一些元素:

[1, 2, 3, 4].select { |num| num.even? } # => [2, 4]

块也可以用于创建自定义方法:

def triple_and_sum(nums)
  nums.map { |num| num * 3 }.reduce(0) { |sum, num| sum + num }
end

triple_and_sum([1, 2, 3]) # => 18
总结

本文介绍了 Ruby 中的块,包括它们的语法、使用方法以及与方法的结合。块是 Ruby 非常有用的特性,可以显著提高代码的可读性和可维护性。