在select语句中使用yield

时间:2015-06-11 22:31:17

标签: ruby

如果我想通过一组给定的参数修剪数组,我会写这样的东西:

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上调用代码块,而不是函数中的数组。这样做的正确方法是什么?

2 个答案:

答案 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]