代码之家  ›  专栏  ›  技术社区  ›  David West

Ruby中有默认的块参数吗?

  •  0
  • David West  · 技术社区  · 6 年前

    我刚开始做Groovy,主要是在做ruby之后。

    它有一个默认的“块参数”, it ,虽然它不是正式的Groovy术语,但我对Groovy还不熟悉。

    (1..10).each {println(it)}
    

    |my_block_arg| 每一次?

    谢谢!

    2 回复  |  直到 6 年前
        1
  •  2
  •   Andrey Deineko    6 年前

    不,在Ruby中没有“默认值”。

    (1..10).each(&method(:puts))
    
        2
  •  1
  •   3limin4t0r    6 年前

    就像 Andrey Deinekos answer 说明没有违约。你可以设置 self 上下文使用 BasicObject#instance_eval BasicObject#instance_exec

    class Enumerator
      def with_ie(&block)
        return to_enum(__method__) { each.size } unless block_given?
        each { |e| e.instance_eval(&block) }
      end
    end
    

    (1..10).each.with_ie { puts self }
    # 1
    # 2
    # 3
    # 4
    # 5
    # 6
    # 7
    # 8
    # 9
    # 10
    #=> 1..10
    

    (1..10).map.with_ie { self * self }
    #=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    (-5..5).select.with_ie { positive? }
    #=> [1, 2, 3, 4, 5]
    

    如果你想调用一个方法 (-5..5).select(&:positive?) ,但是当您迭代的对象具有实际属性时,可能值得麻烦。例如:

    people.map.with_ie { "#{id}: #{first_name} - #{last_name}" }
    

    记住,如果有一个局部变量 id , first_name last_name 可枚举的 自己 设置为包含参数的数组。例如:

    {a: 1, b: 2}.map.with_ie { self }
    #=> [[:a, 1], [:b, 2]]
    {a: 1, b: 2}.map.with_ie { self[0] }
    #=> [:a, :b]