[英]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.