我有一个名为myFilter的方法,它接收一个数组,并过滤掉那些不符合要求的元素。
例如。
arr = [4,5,8,9,1,3,6]
answer = myfilter(arr) {|i| i>=5}
此运行将返回一个包含元素5,8,9,6的数组,因为它们都大于或等于5.
我将如何预成型?算法很简单,但我不明白我们如何处理这种情况。
谢谢。
答案 0 :(得分:3)
我理所当然地认为你不想使用select
方法或类似方法,但你想了解块的工作方式。
def my_filter(arr)
if block_given?
result = []
arr.each { |element| result.push(element) if yield element } # here you use the block passed to this method and execute it with the current element using yield
result
else
arr
end
end
答案 1 :(得分:2)
惯用法是:
def my_filter(arr)
return enum_for(:my_filter, arr) unless block_given?
arr.each_with_object([]) do |e, acc|
acc << e if yield e
end
end
有关Enumerator::Lazy#enum_for
的更多信息。
答案 2 :(得分:0)
你可以做到
def my_filter(arr, &block)
arr.select(&block)
end
然后致电
my_filter([1, 2, 3]) { |e| e > 2 }
=> [3]
但您可以直接使用块调用select
:)