代码之家  ›  专栏  ›  技术社区  ›  Josh Curren

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

  •  31
  • Josh Curren  · 技术社区  · 15 年前

    有人能给我解释一下Ruby在一个块中使用管道字符吗?我知道它包含一个变量名,当它迭代时将为数据赋值。但这叫什么?管道内是否可以有多个变量?还有什么我应该知道的吗?有关于它的更多信息的好链接吗?

    例如:

    25.times { | i | puts i }
    
    3 回复  |  直到 11 年前
        1
  •  27
  •   John Topley    15 年前

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

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

    例如:

    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}"
    }
    

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

        2
  •  5
  •   Christoffer Klang    15 年前

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

    例如,每个带索引的_使用两个变量,将元素放在其中一个变量中,索引放在另一个变量中。

    here is a good description of how blocks and iterators work

        3
  •  2
  •   Eliot Sykes    11 年前

    块参数遵循与方法参数(至少1.9)相同的所有约定:您可以定义可选参数、可变长度参数列表、默认值等。 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”是块的局部,即使没有传入值。