有人可以解释Ruby在块中使用管道字符吗?

时间:2010-11-21 21:58:26

标签: ruby pipe block

有人可以向我解释Ruby在块中使用管道字符吗?据我所知,它包含一个变量名称,在迭代时将为其分配数据。但是这叫什么呢?管道内可以有多个变量吗?还有什么我应该知道的吗?有关它的更多信息的任何良好链接?

例如:

25.times { | i | puts i }

3 个答案:

答案 0 :(得分:27)

大括号定义一个匿名函数,称为块。管道之间的标记是该块的参数。所需的参数数量取决于块的使用方式。每次计算块时,需要块的方法将根据调用它的对象传递一个值。

它与定义方法相同,只是它不存储在接受块的方法之外。

例如:

def my_print(i) 
  puts i
end
执行时

将执行与此相同的操作:

{|i| puts i}

唯一的区别是块是动态定义的而不是存储的。

示例2: 以下陈述是等效的

25.times &method(:my_print)

25.times {|i| puts i}

我们使用匿名块,因为作为块传递的大多数函数通常特定于您的情况,不值得定义以供重用。

那么当一个方法接受一个块时会发生什么?这取决于方法。接受块的方法将通过以明确定义的方式从其调用对象传递值来调用它。返回的内容取决于需要阻止的方法。

例如:在25.times {|i| puts i} .times中,为0和其调用者的值之间的每个值调用一次块,将值作为临时变量i传递给块。 Times返回调用对象的值。在这种情况下25。

让我们看看接受带有两个参数的块的方法。

{:key1 => "value1", :key2 => "value2"}.each {|key,value| 
     puts "This key is: #{key}. Its value is #{value}"
}

在这种情况下,每个键都会为每个键/值对调用块1,将键作为第一个参数传递,将值作为第二个参数传递。

答案 1 :(得分:5)

管道指定由调用块的函数填充值的参数。可以有零个或多个,你应该使用多少取决于你调用的方法。

例如,each_with_index使用两个变量并将元素放在其中一个中,将索引放在另一个中。

here is a good description of how blocks and iterators work

答案 2 :(得分:2)

块参数遵循与方法参数相同的约定(至少从1.9开始):您可以定义可选参数,可变长度arg列表,默认值等。这是一个pretty decent summary

有些事情要注意:因为块看到它们被定义的范围内的变量,如果你传入一个与现有变量同名的参数,它会“遮蔽”它 - 你的块会看到传递在值和原始变量将保持不变。

i = 10
25.times { | i | puts i }
puts i #=> prints '10'

最后会打印'10'。因为有时这是理想的行为,即使你没有传入一个值(即你想确保你不会意外地从周围的范围中删除一个变量),你可以在参数列表后面的分号后面指定块本地变量名:

x = 'foo'
25.times { | i ; x | puts i; x = 'bar' }
puts x #=> prints 'foo'

这里,'x'是块的本地,即使没有传入任何值。