我如何修改我的ruby方法,使它同时接受一块代码?

我如何修改我的ruby方法,使它同时接受一块代码?,ruby,methods,yield,Ruby,Methods,Yield,我有一个名为myFilter的方法,它接受一个数组,过滤掉不符合要求的元素 比如说 arr = [4,5,8,9,1,3,6] answer = myfilter(arr) {|i| i>=5} 此运行将返回一个包含元素5、8、9、6的数组,因为它们都大于或等于5 我该怎么做呢?算法很简单,但我不明白在那种情况下我们是怎么做的 谢谢你。你能做到 def my_filter(arr, &block) arr.select(&block) end 然后打电话 my_f

我有一个名为myFilter的方法,它接受一个数组,过滤掉不符合要求的元素

比如说

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

answer = myfilter(arr) {|i| i>=5}
此运行将返回一个包含元素5、8、9、6的数组,因为它们都大于或等于5

我该怎么做呢?算法很简单,但我不明白在那种情况下我们是怎么做的

谢谢你。

你能做到

def my_filter(arr, &block)
  arr.select(&block)
end
然后打电话

my_filter([1, 2, 3]) { |e| e > 2 }
=> [3]
但是您可以直接用一个块调用
select
:)

您可以这样做

def my_filter(arr, &block)
  arr.select(&block)
end
然后打电话

my_filter([1, 2, 3]) { |e| e > 2 }
=> [3]

但是,您可以直接用块调用
select
:)

我认为您当然不想使用
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

我想当然地认为您不想使用
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

惯用的方法是:

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
def my_过滤器(arr)
返回(:my_filter,arr)的enum_,除非给出了block_?
与对象([])对齐的每个对象|

acc惯用的方式是:

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
def my_过滤器(arr)
返回(:my_filter,arr)的enum_,除非给出了block_?
与对象([])对齐的每个对象|

acc你写过你有这样的方法,但毕竟,你似乎没有这样的方法。你能给我们看看你的方法myFilter中的代码吗?你知道
myFilter(arr){…}
相当于
arr.select{…}
,不是吗?如果你想让我们告诉你如何修改你的方法,你可能应该向我们展示你的方法。你写过你有这样的方法,但毕竟,你似乎没有这样的方法。你能给我们展示你的方法myFilter中的代码吗?你知道
myFilter(arr){…}
相当于
arr.select{…}
,不是吗?如果你想让我们告诉你如何修改你的方法,您可能应该向我们展示您的方法。好的做法是为(:myfilter,*args)提供
返回枚举,除非给出了block\u?
以便能够在没有块(lazy)的情况下调用此方法。好的做法是为(:myfilter,*args)提供
返回枚举除非给出了block_?
,否则可以在没有块的情况下调用此方法(lazy.)