代码之家  ›  专栏  ›  技术社区  ›  Mike Berrow

了解Ruby中lambda与inject的行为

  •  5
  • Mike Berrow  · 技术社区  · 18 年前

    我经常将预先配置的lambda插入到可枚举的方法中,如“map”、“select”等。 但“注入”的行为似乎有所不同。 例如

    mult4 = lambda {|item| item * 4 }
    

    然后

    (5..10).map &mult4
    

    给我

    [20, 24, 28, 32, 36, 40]
    

    但是,如果我制作一个2参数lambda用于类似于inject的函数,

    multL = lambda {|product, n| product * n }
    

    我想说

    (5..10).inject(2) &multL
    

    因为“inject”有一个可选的 单一的 初始值的参数, 但这给了我…

    irb(main):027:0> (5..10).inject(2) &multL
    LocalJumpError: no block given
            from (irb):27:in `inject'
            from (irb):27
    

    但是,如果我将“multl”填充到 第二 要注入的参数,然后它工作。

    irb(main):028:0> (5..10).inject(2, &multL)
    => 302400
    

    我的问题是“为什么这样做有效,而不是以前的尝试?”

    1 回复  |  直到 18 年前
        1
  •  11
  •   rampion    18 年前

    所以原因是

    (5..10).map &mult4
    

    作品及

    (5..10).inject(2) &multL
    

    不是Ruby Parens在第一种情况下是隐式的,所以它实际上意味着

    (5..10).map(&mult4)
    

    如果你想的话,第二个案子你可以用

    (5..10).inject 2, &multL
    

    Parens的外部技巧只适用于将块传递给方法,而不是lambda对象。