模块的工作原理就像一个方法,但它没有一个名字。它不属于任何对象。块也可以视为未指定的代码块,它们可以消耗参数形式的输入并返回一些值。最重要的是,只有在调用方法并且使用yield语句将值与值一起调用方法内部的块时,才能通过将块传递给方法的方式来创建块。
考虑以下代码,
7.times do puts "Oh, hello from inside a block. You are at Nhooo!" end
输出结果
Oh, hello from inside a block. You are at Nhooo! Oh, hello from inside a block. You are at Nhooo! Oh, hello from inside a block. You are at Nhooo! Oh, hello from inside a block. You are at Nhooo! Oh, hello from inside a block. You are at Nhooo! Oh, hello from inside a block. You are at Nhooo! Oh, hello from inside a block. You are at Nhooo!
您可以在上面的代码中观察到time是一种在数字上定义的方法。7.times将表达式打印7次。
调用times方法时,仅传递一个块,该块是do和end语句之间的已命名代码块。
没有对象参与方法时间。
1)在do ... end语句中
这是该块的最常见用法。代码的主要部分具有这种类型的实现。
语法:
name_of_block do #expression-1 #expression-2 end
示例
["C++", "Ruby", 155,"Nhooo","Java","Python",789,889.6].each do |k| puts k end
输出结果
C++ Ruby 155 Nhooo Java Python 789 889.6
2)花括号{}之间(内联实现)
无需do ... end语句即可执行以上操作。可以通过将表达式放在花括号{}中来完成相同的操作。
语法:
name_of_the_block{ #expression_to_be_executed }
示例
["C++", "Ruby", 155,"Nhooo","Java","Python",789,889.6].each {|k| puts k }
输出结果
C++ Ruby 155 Nhooo Java Python 789 889.6
当您想在方法内部调用一个块时,Ruby为此提供了yield语句。当您在方法内部调用一个块时,将使用关键字yield。
yield语句还可以使用参数。
示例
# 方法Nhooo def Nhooo # 要执行的表达式 puts "Inside Nhooo!" # 使用yield语句 # 教程是参数 yield "Tutorial" # 要执行的表达式 puts "Again Inside Nhooo!" # 使用收益声明 # Nhooo.com上的教程是参数 yield "Tutorial at Nhooo.com" end # 块 Nhooo{ |example| puts "Inside Block #{example}"}
输出结果
Inside Nhooo! Inside Block Tutorial Again Inside Nhooo! Inside Block Tutorial at Nhooo.com
在上面的代码中,您可以观察到,首先,调用了显示Nhooo的方法表达式。之后,当yield语句被找到并执行时,指针进入block内部以执行其语句。成功执行后,指针将返回该方法,该方法将从调用yield语句的位置继续执行。