使用lambda-insideruby方法
我刚从Ruby开始,我遇到了一个问题,我觉得这个问题对语言很重要,所以我不想仅仅通过它。我真的很感激你们的回答,它不仅包括一个有效的例子,而且至少包括我在哪里出了问题的简要解释 所以第一步是采用以下方法:使用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
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
,并像这样调用filterfilter([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:啊,是的,完全是这样。