代码之家  ›  专栏  ›  技术社区  ›  Leron

在Ruby方法中使用lambda

  •  1
  • Leron  · 技术社区  · 6 年前

    我只是从 Ruby 我碰到了一个问题,我觉得这对语言很重要,所以我不想只是通过它。我真的很感激回答,其中不仅包括一个工作的例子,但至少简短的解释,我错了我的。

    第一 步骤是使用此方法:

    def filter (arr)
        arr.each do |e|
            puts e if e % 2 != 0
        end
    end 
    
    filter [1, 2, 3, 4, 5, 6]
    

    1 3 5[在0.2秒内完成]

    我试过这个:

    def filter (arr)
        arr.each do |e|
            puts e if yield(e)
        end
    end 
    
    filter ([1, 2, 3, 4, 5, 6]) { |n| n.odd? }
    

    我得到了同样的结果:

    1 3 5[在0.2秒内完成]

    第三 filter 像这样的方法 filter([1, 2, 3, 4, 5, 6], &is_odd) . 但由于我还没弄明白,我现在被困在这一点上:

    is_odd = lambda { |n| puts n if n.odd? }
    
    def filter ()
        arr = [1, 2, 3, 4, 5, 6]
        arr.each do |e|
            is_odd(e)
        end
    end 
    
    filter &is_odd
    

    我得到了以下错误:

    block in filter': undefined method 你觉得奇怪吗主要:对象 (命名者)

    功能和使用方法如下:

    def filter ()
        is_odd = lambda { |n| puts n if n.odd? }
        arr = [1, 2, 3, 4, 5, 6]
        arr.each &is_odd
    end 
    
    filter
    

    is_odd 外面 筛选器([1、2、3、4、5、6],&I是奇数) .

    我想知道是否真的可以这样使用lambda,如果可以,我的逻辑在哪里失败了?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Sergio Tulentsev    6 年前

    我想知道是否真的有可能这样使用lambda

    如果是,我的逻辑在哪里失败了?

    通过传递lambda作为 &is_odd yield . 这里有另一种方法来调用经过的块。

    is_odd = lambda { |n| puts n if n.odd? }
    
    def filter(&block)
        arr = [1, 2, 3, 4, 5, 6]
        arr.each do |e|
            block.call(e)
        end
    end 
    
    filter(&is_odd)
    # >> 1
    # >> 3
    # >> 5