📅  最后修改于: 2021-01-08 13:08:40             🧑  作者: Mango
Ruby代码块在其他编程语言中称为闭包。它由一组代码组成,这些代码始终用大括号括起来或写在do..end之间。大括号语法始终比do..end语法具有更高的优先级。大括号具有较高的优先级,而do的优先级较低。
块以两种方式写入:
两者相同并且具有相同的功能。
要调用一个块,您需要具有一个与该块同名的函数。
始终使用函数调用块。块可以有自己的参数。
句法:
block_name{
statement1
statement2
..........
}
例:
以下示例显示了多行块。
[10, 20, 30].each do |n|
puts n
end
输出:
下面的示例显示了内联块。
[10, 20, 30].each {|n| puts n}
输出:
yield语句用于调用具有值的方法中的块。
例:
#!/usr/bin/ruby
def met
puts "This is method"
yield
puts "You will be back to method"
yield
end
met {puts "This is block"}
输出:
在执行met方法时,当我们到达屈服线时,将执行块内的代码。块执行完成后,met方法的代码继续。
通过yield语句传递参数
yield语句可以传递一个或多个参数。
例:
#!/usr/bin/ruby
def met
yield 1
puts "This is method"
yield 2
end
met {|i| puts "This is block #{i}"}
输出:
我们可以在块参数的内部和外部使用相同的变量。让我们看下面的例子。
例:
#!/usr/bin/ruby
x = "Outer variable"
3.times do |x|
puts "Inside the block: #{x}"
end
puts "Outside the block: #{x}"
输出:
在此示例中,我们在块内部将相同的变量用作块参数x,将块外部的变量用作变量x。
Ruby BEGIN和END块分别用于声明正在加载文件和已加载文件。
例:
#!/usr/bin/ruby
BEGIN {
puts "code block is being loaded"
}
END {
puts "code block has been loaded"
}
puts "This is the code block"
输出:
&block是一种将对块的引用(而不是局部变量)传递给方法的方法。
在这里,&后面的正楷词只是参考的名称,可以使用任何其他名称代替。
例:
def met(&block)
puts "This is method"
block.call
end
met { puts "This is &block example" }
输出:
在这里,方法met中的块变量met是对该块的引用。它通过调用mehtod执行。调用方法与yield方法相同。
Ruby有一个名为yield(self)的初始化程序。这里, self是要初始化的对象。
例:
class Novel
attr_accessor :pages, :category
def initialize
yield(self)
end
end
novel = Novel.new do |n|
n.pages = 564
n.category = "thriller"
end
puts "I am reading a #{novel.category} novel which has #{novel.pages} pages."
输出: