2011-01-18 15 views
13

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.

+4

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. –

+1

Non trovo sempre un bug nella lingua stessa, ma quando lo faccio uso Ruby. –

risposta

13

Questo è quasi certamente un errore,

Ho il sospetto che la ragione per questo sta accadendo è che il metodo # chiamata ha arity -1 (In attesa di una matrice C di argomenti), e ProC# chiamata è arity -2 (Expecting una matrice ruby ​​di argomenti).

C'è un commento più utile nel eval.c sopra la definizione di ProC# chiamata che potrebbe gettare ulteriore luce sulla questione:

/* CHECKME: stanno controllando l'argomento semantica corretta? */

Forse dovremmo cambiare la situazione a un FIXME: p

+4

È stato risolto in Ruby 1.9, quindi penso che sia stato un errore :) – sethvargo

Problemi correlati