如何修改我的ruby方法,以便它也包含一段代码?

时间:2017-06-20 09:18:13

标签: ruby methods yield

我有一个名为myFilter的方法,它接收一个数组,并过滤​​掉那些不符合要求的元素。

例如。

arr = [4,5,8,9,1,3,6]

answer = myfilter(arr) {|i| i>=5}

此运行将返回一个包含元素5,8,9,6的数组,因为它们都大于或等于5.

我将如何预成型?算法很简单,但我不明白我们如何处理这种情况。

谢谢。

3 个答案:

答案 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:)