2016-11-20 21 views
3
def method1(&proc) 
    proc.call(1,2,3) 
end 

method1{ |x,y,z,a| puts a} 

不會引發任何錯誤和輸出nil爲什麼proc不關心參數的數量?

爲什麼它不檢查的參數?它背後的邏輯是什麼?

+1

[proc'的Ruby文檔](https://ruby-doc.org/core-2.2.0/Proc.html)說:「由proc生成的Proc對象忽略額外的參數...它爲缺少的論點提供了零。「這就是你的情況。 – rlandster

回答

2

Proc我們做不關心驗證的論點,但拉姆達的做正確的數...

def method1(&proc) 
    proc.call(1,2,3) 
end 

method1 { |x,y,z,a| puts a} 
method1 lambda { |x,y,z,a| puts a } 

結果:

lambda.rb:1:in `method1': wrong number of arguments (given 1, expected 0) (ArgumentError) 
    from lambda.rb:6:in `<main>' 

ruby docs

對於使用lambda或 - >()創建的procs,如果將錯誤數量的參數傳遞給Proc,則會生成錯誤有多個參數。對於使用Proc.new或Kernel.proc創建的procs,額外的參數將被默默丟棄。

+0

proc通過這個實現了什麼?一些性能改進? – InQusitive

+0

這是一個很好的問題,但我不知道答案... – Anthony

+0

@InQusitive:我沒有用過這個功能我自己,但它也可能是一些使用的元編程模式。 – Dmitri