如果我想通过一组给定的参数修剪数组,我会写这样的东西:
array = [4,5,6,7,8]
a = array.select{|i| i>=5}
puts a.inspect
将返回[5,6,7,8]
。
我想编写一个功能“过滤器”来完成同样的事情。在这种情况下,我的第一个想法就是写下这样的东西:
array = [4,5,6,7,8]
a = filter(array) {|i| i >= 5}
puts a.inspect
我无法弄清楚如何在yield
语句中正确调用方法中的select
来调用代码块:
a = array.select{yield}
似乎没有用,因为它试图在nil上调用代码块,而不是函数中的数组。这样做的正确方法是什么?
答案 0 :(得分:1)
不知道你是否有意义,但请尝试:
def filter(array)
array.select { |i| yield(i) }
end
array = [4,5,6,7,8]
p filter(array) {|i| i >= 5}
答案 1 :(得分:0)
当您在大括号{...}
中编写要传递给方法的代码时,此代码称为块。它通常隐式传递给方法(即它不是命名参数)。要调用此隐式块,请调用yield
。
在你的情况下,你不想自己调用这个块;您希望filter
方法将块传递到select
,进行实际过滤。
要向"传递一个块",您可以使用&
前缀明确方法的块参数。请注意,此示例中的名称block
只是约定;没有特殊的block
关键字。重要的部分是&
字符:
def filter(array, &block)
array.select(&block)
end
array = [4,5,6,7,8]
filter(array) { |i| i >= 5 } # => [5,6,7,8]