📜  Ruby 中的闭包(1)

📅  最后修改于: 2023-12-03 15:34:45.826000             🧑  作者: Mango

Ruby 中的闭包

什么是闭包?

闭包是指可以访问其它函数作用域中变量的函数。在 Ruby 中,闭包是通过使用块(block)或 Proc 对象实现的。

块是 Ruby 中可以传递给方法的一段代码,类似于 JavaScript 中的匿名函数。块可以在方法内部调用,也可以传递给其它方法。当使用 yield 时,可以将块传递给方法。

使用块

以下是一个使用块的简单例子:

def my_method
  puts "start"
  yield
  puts "end"
end

my_method do
  puts "Hello, world"
end

输出:

start
Hello, world
end

在上面的例子中,my_method 中的 yield 语句会调用传递给块中的代码。

块变量

块也可以接受参数。块变量使用垃圾邮件符(| |)包裹,多个变量可以用逗号分隔。块变量可以在 yield 时传递。

以下是一个例子:

def my_method
  puts "start"
  yield(1, 2)
  puts "end"
end

my_method do |x, y|
  puts "x: #{x}, y: #{y}"
end

输出:

start
x: 1, y: 2
end
传递块

块可以作为参数传递给其它方法,比如 Array#each 方法。

以下是一个使用 Array#each 的例子:

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

输出:

1
2
3
Proc

Proc 是一个对象,可以将其看作是一个闭包,可以将其传递给其它方法,并可以存储在变量中。

创建 Proc

创建 Proc 对象有多种方法。

  1. 使用 Proc.new 或 Kernel#proc。
p = Proc.new do |x|
  puts x
end

p.call("Hello, world")

输出:

Hello, world
  1. 使用 & 操作符和块。& 操作符会将块转换为 Proc 对象。
def my_method(&p)
  p.call("Hello, world")
end

my_method do |x|
  puts x
end

输出:

Hello, world
使用 Proc

Proc 对象可以像方法一样调用并传递参数。

p = Proc.new do |x|
  puts x
end

p.call("Hello, world")

输出:

Hello, world
存储 Proc

可以将 Proc 对象存储在变量中,以便在以后调用。

p = Proc.new do |x|
  puts x
end

p.call("Hello, world")

输出:

Hello, world
使用块或 Proc 对象改善代码重复

使用块或 Proc 对象可以改善代码重复。以下是一个例子:

def repeat(n)
  n.times do
    yield
  end
end

repeat(3) do
  puts "Hello"
end

输出:

Hello
Hello
Hello

在上面的例子中,repeat 方法使用块来完成代码重复的任务。

结论

在 Ruby 中,使用块和 Proc 对象可以轻松地实现闭包,从而使代码更加简洁和易于维护。