Dato il seguente metodo che accetta un argomento:Si tratta di un errore nel metodo # to_proc? (Vermiglio 1.8.7)
def foo(arg); p arg; end
mi può chiamare con un array vuoto:
foo([])
# prints []
posso anche salvarla come oggetto Method
e chiamare che con un array vuoto, con lo stesso risultato:
method(:foo).call([])
# prints []
Tuttavia, se c onvert l'Method
oggetto a un Proc
e chiamare che con un array vuoto, ottengo un ArgumentError
:
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'
Mi aspettavo che si comportano come due casi precedenti. Invece, sembra comportarsi come se avessi scritto foo(*[])
. Tuttavia, se chiamo con un non matrice -empty, si fa comportarsi come mi aspettavo:
method(:foo).to_proc.call([1])
# prints [1]
Così destruttura l'argomento, ma solo se l'argomento sembra essere un array vuoto. E solo se chiamo Method#to_proc
.
C'è una lacuna nella mia comprensione di come funziona Method
o Proc
o si tratta di un errore?
Sto eseguendo Ruby 1.8.7-p299. Osservo lo stesso comportamento in 1.8.6-p399 e 1.8.7-head. Tuttavia, non lo vedo in 1.9.1-p378: in tutti e tre i moduli viene stampato []
quando viene chiamato con un array vuoto.
Normalmente io sono scettico quando qualcuno pensa di aver trovato un bug nel linguaggio stesso, ma non vedo altra spiegazione per questo comportamento, soprattutto se si considera che funzioni come previsto in 1.9. Spero che qualcuno più saggio possa illuminarci, perché questo mi ha incuriosito. –
Non trovo sempre un bug nella lingua stessa, ma quando lo faccio uso Ruby. –