2017-06-20 34 views
0

我有一個名爲myFilter的方法,它接受一個數組,並過濾​​出不符合要求的元素。我該如何修改我的ruby方法,以便它還包含一段代碼?

例如。

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

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

此運行將與元素5,8,9,6返回數組,因爲他們比我將如何瓶坯這一切都大於或等於5

?該算法很容易,但我不明白我們如何採取這種情況。

謝謝。

+2

你寫過,你有這樣的方法,但畢竟,似乎你沒有這樣的方法。 – sawa

+0

你能告訴我們你的方法myFilter中的代碼嗎? – garyh

+0

您知道'myfilter(arr){...}'相當於'arr.select {...}',不是嗎? – Stefan

回答

0

你可以做

def my_filter(arr, &block) 
    arr.select(&block) 
end 

然後調用

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

而是你可以調用select直接塊:)

+0

這非常完美非常感謝 – EaEaEa

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 
+2

好的做法是提供'return enum_for(:myfilter,* args),除非block_given?'這個方法可以在沒有塊的情況下調用(懶惰)。 – mudasobwa

2

的慣用方法是:在Enumerator::Lazy#enum_for

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 

更多信息。

相關問題