Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用lambda-insideruby方法_Ruby - Fatal编程技术网

使用lambda-insideruby方法

使用lambda-insideruby方法,ruby,Ruby,我刚从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 fi

我刚从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秒内完成]

第三个我想使用lambda执行此操作。最后,我希望调用
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
我得到了以下错误:

过滤器中的块:main:Object的未定义方法
为奇数 (命名者)

这对我来说是有意义的,因为如果我在
filter
函数中定义lambda并像这样使用它:

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

filter
我再次得到了预期的行为,但我遵循了一个教程,似乎可以在
filter
方法之外声明
is\u odd
,并像这样调用filter
filter([1,2,3,4,5,6],&is\u odd)

我想知道是否确实有可能以这种方式使用lambda,如果有,我的逻辑在哪里失败了

我想知道这样使用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
我想知道这样使用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

谢谢,我想知道这个选项。在方法定义中包含lambda可以吗?@Leron:the
&block
?这不再是你的lambda了。在本例中,它是一个Proc对象,它由方法的块(反过来,它又来自lambda)生成。是的,这是在ruby代码中常见的现象。可能值得注意的是,在调用lambda时不使用这样的括号,因此使用了nomethoderor。你可以使用括号(
some_lamba[arg]
)、
\call
some_lambda.call(arg)
)或点括号(
some_lambda.(arg)
)。@muistooshort:是的,完全正确。谢谢,我想知道这个选项。在方法定义中包含lambda可以吗?@Leron:the
&block
?这不再是你的lambda了。在本例中,它是一个Proc对象,它由方法的块(反过来,它又来自lambda)生成。是的,这是在ruby代码中常见的现象。可能值得注意的是,在调用lambda时不使用这样的括号,因此使用了nomethoderor。你可以使用括号(
some lamba[arg]
),
\call
some lambda.call(arg)
),或者点括号(
some lambda.(arg)
)。@muistooshort:啊,是的,完全是这样。