簡體   English   中英

將塊作為參數傳遞和將 proc 作為參數傳遞有什么區別?

[英]What is the difference between passing a block as an argument and passing a proc as a argument?

我們必須編寫一個 function,它應該接受一個數組、一個過程和一個塊作為參數。 它應該返回數組中傳遞到塊時結果最大的元素。 如果是平局,它應該使用 proc 來打破平局。

解決方案如下:

def max_tie_breaker(array, tie_breaker, &prc)
    return nil if array.empty?
    max = array.first
    array.each do |el|
        result_el = prc.call(el)
        result_max = prc.call(max)
        if result_el > result_max
            max = el
        elsif result_el == result_max && tie_breaker.call(el) > tie_breaker.call(max)
            max = el
        end
    end
    max
end

在測試代碼時,他們做了以下事情:

array_1 =['potato', 'swimming', 'cat'] 
array_2 = ['cat', 'bootcamp', 'swimming', 'ooooo']
array_3 = ['photo','bottle', 'bother'] 
length = Proc.new { |s| s.length } 
o_count = Proc.new { |s| s.count('o') }

        

print max_tie_breaker(array_1, o_count, &length)
#('swimming')
puts
print max_tie_breaker(array_2, length, &o_count)
#('ooooo')
puts

我不明白的是,如果他們將塊和 proc 作為 arguments 傳遞,那么該塊將在方法參數中顯示為 &prc,將通過在調用方法時傳入一個塊來調用。 例如調用 max_tie_breaker,你不會輸入:max_tie_breaker(array_1, o_count) { |s| s.length } 而不是 max_tie_breaker(array_1, o_count, &length)。 基本上,我不明白他們如何有一個方法需要一個數組、一個塊和一個 proc 作為參數,但是用一個數組和兩個 proc 調用它,它仍然可以正常工作。

提前感謝您的任何幫助或指導。

&運算符嘗試將后面的任何內容轉換為塊。

因此,當您使用foo(a, &b)調用方法時,該方法不會收到 2 arguments,該方法會收到a作為它的第一個也是唯一的參數,並且還會獲得一個塊。

方法可以通過使用yield關鍵字來調用塊,或者再次使用&運算符將它們變成可調用的過程。

例如def foo(a, &b)可以被稱為foo(a, &b)foo(a) { "bar" } 在這兩種情況下,方法b內部都是一個代表給定塊的過程。

使用 2 個 proc 而不是 proc 和一個塊調用此方法會產生錯誤。

def foo(a, &b)
end

foo(->{}, ->{}) # ArgumentError: wrong number of arguments (given 2, expected 1)
foo(->{}, &->{}) # nil
foo(->{}) {} # nil
foo(->{}) do end # nil

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM