📅  最后修改于: 2023-12-03 15:34:45.826000             🧑  作者: Mango
闭包是指可以访问其它函数作用域中变量的函数。在 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 对象有多种方法。
p = Proc.new do |x|
puts x
end
p.call("Hello, world")
输出:
Hello, world
def my_method(&p)
p.call("Hello, world")
end
my_method do |x|
puts x
end
输出:
Hello, world
Proc 对象可以像方法一样调用并传递参数。
p = Proc.new do |x|
puts x
end
p.call("Hello, world")
输出:
Hello, world
可以将 Proc 对象存储在变量中,以便在以后调用。
p = Proc.new do |x|
puts x
end
p.call("Hello, world")
输出:
Hello, world
使用块或 Proc 对象可以改善代码重复。以下是一个例子:
def repeat(n)
n.times do
yield
end
end
repeat(3) do
puts "Hello"
end
输出:
Hello
Hello
Hello
在上面的例子中,repeat 方法使用块来完成代码重复的任务。
在 Ruby 中,使用块和 Proc 对象可以轻松地实现闭包,从而使代码更加简洁和易于维护。