2011-01-18 19 views
13

Bir argüman alan aşağıdaki metot verildi:Bu bir yöntem # to_proc dosyasında mı? (Ruby 1.8.7)

def foo(arg); p arg; end 

Boş bir dizi ile çağırabilirim:

foo([]) 
# prints [] 

Ayrıca Method nesnesi olarak kaydedebilir ve ile boş aynı sonucu dizisi,:

method(:foo).call([]) 
# prints [] 

Ancak, bir Proc için Method nesneyi dönüştürmek ve boş bir dizi ile, ben bir ArgumentError almak ararsanız:

method(:foo).to_proc.call([]) 
# ArgumentError: wrong number of arguments (0 for 1) 
# from (irb):4:in `foo' 
# from (irb):4:in `to_proc' 
# from (irb):10:in `call' 

bunu bekliyordum önceki iki durumla aynı davranmak. Bunun yerine, foo(*[]) yazmış gibi davranıyor gibi görünüyor. Ancak, ben beklediğimden şekilde davranır yapar bir olmayan-boş dizisi, onunla dersek: Bu argüman destructures ama argüman boş bir dizisi olmak üzere yalnızca Yani

method(:foo).to_proc.call([1]) 
# prints [1] 

. Ve sadece Method#to_proc'i çağırırsam.

nasıl Method veya Proc iş benim anlayış bir boşluk var mı, yoksa bu bir hata olduğunu?

Ben Ruby 1.8.7-p299 koşuyorum. Aynı davranışı 1.8.6-p399 ve 1.8.7-başlarında gözlemliyorum. Ancak, 1.9.1-P378 bunu görmüyorum: Orada her üç formları baskı [] boş bir dizi ile çağrıldığında.

+4

Normalde şüpheci p ama özellikle dikkate alınarak, bu davranış için başka hiçbir açıklamaya bakın: */

Belki bir FIXME bu değişmelidir 1.9'da beklendiği gibi çalışır. Umarım birileri bizi aydınlatabilir, çünkü bu bana oldukça meraklı geliyor. –

+1

Dilin kendisinde her zaman bir hata bulamıyorum, ancak ben ne zaman Ruby kullanıyorum. –

cevap

13

Bu neredeyse kesin bir hata, Yöntem # arama Arity -1 (bağımsız değişkenler Cı dizisi beklemek) sahip olmasıdır, ve ProC# arama Arity -2 (beklemek sahip Bir Ruby argüman dizisi).

konuda daha fazla ışık tutabilir ProC# çağrısının tanımında yukarıda eval.c daha da yararlı açıklama vardır:

/* CHECKME: argüman kontrol ediyoruz semantik doğru mu? birisi dilin kendisinde bir hata buldum düşündüğünde

+4

Bu Ruby 1.9'da düzeltildi, bu yüzden bir hata olduğunu düşünüyorum :) – sethvargo

İlgili konular