2016-04-03 47 views
2

當我把下面的類單獨的方法,我期待ArgumentError,但我看到:預計ArgumentError,但是得到了NoMethodError

class A 
    def with_one_argument(&block) 
    block.call 
    end 
end 

A.new.with_one_argument 
# => NoMethodError: undefined method `call' for nil:NilClass 

但這充當預期:

class B 
    def with_one_argument(some_value) 
    puts some_value 
    end 
end 

B.new.with_one_argument 
# => ArgumentError: wrong number of arguments (0 for 1) 

任何人可以解釋爲什麼(&block)被視爲特殊?根據我的理解,如果我沒有爲參數提供默認值,那麼預計爲ArgumentError

+1

感謝編輯@sawa,它現在看起來更清潔:) – illusionist

回答

2

沒什麼複雜的。事實上,一個街區並不是一個爭論點。使用A時,如果您通過一個塊,則將其稱爲block作爲轉換的proc,否則block的值爲nil。但是在任何一種情況下,block都是將傳遞的塊(既不是參數也不是對象)轉換爲proc(它是一個對象)的結果。

+0

但名稱'block'是由我給出的,我可以放任何我喜歡的名稱並以此方式使用它。它怎麼沒有爭論?你能提供一些參考鏈接@Sawa – illusionist

相關問題