2012-03-28 11 views

risposta

35

Un blocco è non un lambda. Per vedere se c'è un blocco utilizzare block_given?.

In ogni caso, utilizzerei "risponde per chiamare" se e solo se avevo davvero bisogno di questo costrutto, che avrei cercato di evitare. (Definire il contratto e fare il chiamante responsabile per invocare correttamente!)

(lambda {1}).respond_to? :call # => true 
(1).respond_to? :call   # => false 

Credo che questa forma di strutturale (aka anatra) la tipizzazione è più in linea con Ruby di tipizzazione nominativo con "è una "relazione.

Per vedere ciò che "è un" relazioni potrebbe contenere (per il futuro di gioco in una sandbox):

RUBY_VERSION   # => 1.9.2 
(lambda {}).class  # => Proc 
(Proc.new {}).class # => Proc 
def x (&p); p; end  # note this "lifts" the block to a Proc 
(x {}).class   # => Proc 

Felice di codifica.

+0

Molto interessante il fatto che esiste un metodo 'respond_to?'. Rende molto più semplice questo tipo di cose. – Automatico

Problemi correlati