2016-04-03 18 views
2

var, ama bakın:Beklenen ArgumentError ama NoMethodError

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

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

Ama bu beklendiği gibi davranan:

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) 

herkes açıklayabilir Neden (&block) özel olarak kabul edilir? Benim anlayışımda, bir argüman için bir varsayılan değer sağlamazsam, o zaman ArgumentError bekleniyor.

+1

düzenleme @sawa için teşekkürler, şimdi daha temiz görünüyor :) – illusionist

cevap

2

Karmaşık bir şey yok. Gerçek şu ki, bir blok bir argüman değildir. A ile, bir bloğu iletirseniz, bu dönüştürülen bir proc olarak block olarak adlandırılır, aksi halde block değeri nil değerine sahiptir. Ancak her iki durumda da, block, geçirilen bloğun (argüman veya nesne olmayan) proc'ye (bir nesne) dönüştürülmesinin sonucudur.

+0

ama "blok" ismi benim tarafımdan verildi, ben istediğim herhangi bir ismi koyabilir ve bu şekilde kullanabilirsiniz. Nasıl bir argüman değil? @Sawa'ya bazı referans linkleri sağlayabilir misiniz? – illusionist