2011-09-14 19 views
7

Ben herhangi bir hatalara neden olmadığınıFoo (& nil), foo'dan (& "proc değil") farklı davranır?

[1, 2, 3].each(&nil) 

heckle öğrendim - bu sadece bir sýralayýcý döndürür. Buna karşılık

,

[1, 2, 3].each(&"") 

Ayrıca &nil nedenleri block_given

TypeError: wrong argument type String (expected Proc) 

yükseltir? Ben RDoc kontrol - NilClassto_proc uygulayan için değil

def block_given_tester 
    if block_given? 
    puts "Block given" 
    else 
    puts "Block not given" 
    end 
end 

block_given_tester(&nil) # => Block not given 

return false için.

Ben &nil olması güzel olurdu nedenanlayabiliyorum, ama ben nasıl yapıldığını emin değilim. Bu, nil yollarından yalnızca başka nesneler tarafından paylaşılmayan özel davranışlara sahip mi?

cevap

7

Yanıt, Ruby'nin kaynak koduna bakarak bulunabilir.

Yakut 1.8: Dosya eval.c işlev block_pass de

bak. Not nil özel olarak Proc nesnelerinden (makro NIL_P) davranır. Eğer fonksiyon sıfır değerinden geçerse, boş bir bloğu (sanırım) değerlendirir ve geri döner. Kod, nesnenin bir Proc nesnesini (işlev rb_obj_is_proc) olup olmadığını kontrol eder ve eğer değilse "yanlış argüman türü (beklenen Proc") istisnasını kaldırır.

Yakut 1.9.2: dosyasında vm_insnhelper.c yöntemin caller_setup_args de

bak. Eğer sıfır değilse to_proc ile sadece proc dönüştürür; aksi halde, tip dönüştürme ve tip kontrolü atlanır.

+0

1,9 şubeden biri olmayan 1.8 şubeden birine baktığınızı düşünüyorum. –

+0

Evet, Ruby 1.8'den beri mevcut olan kod. Bir şey değişip değişmediğini görmek için şimdi Ruby 1.9.2 kodunu indiriyorum. –

+1

Ruby 1.9.2 için cevabımı düzenledim. –