作者:手机用户2702938061 | 来源:互联网 | 2022-12-05 21:11
我刚刚开始,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
我收到以下错误:
block in filter': undefined method
is_odd'for main:Object(NoMethodError)
对我来说这是有道理的,因为如果我在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
我再次得到预期的行为,但我正在遵循一个教程,似乎应该可以is_odd
在filter
方法之外声明并调用过滤器这样filter([1, 2, 3, 4, 5, 6], &is_odd)
.
我想知道是否确实可以这样使用lambda,如果是的话,我的逻辑在哪里失败了?
1> Sergio Tulen..:
我想知道是否确实可以这样使用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