2009-05-29 18 views
27

Nel Ruby Programming Language, Capitolo 6 (secondo comma) affermano:funzioni di Ruby vs metodi

Molte lingue distinguere tra funzioni, che non hanno oggetto associato, e metodi, che sono richiamati su un ricevitore oggetto. Poiché Ruby è un linguaggio puramente orientato agli oggetti, tutti i metodi sono metodi veri e sono associati ad almeno un oggetto.

E poi nel bel mezzo del 6 ° comma:

Sia proc e lambda sono funzioni piuttosto che metodi invocati su un oggetto .

Sono un po 'confuso su queste affermazioni. Ruby è veramente puro OO e quindi non ha funzioni che non sono associate ad oggetti (se questa è una definizione valida di OO puro) o sono proc/lambdas associati all'oggetto Proc? Qual è la differenza tra funzioni e metodi in Ruby?

Qualsiasi aiuto nell'analisi e nella comprensione di questo sarebbe apprezzato.

risposta

21

lambda s in Ruby sono oggetti di classe Proc. Gli oggetti Proc non appartengono a nessun oggetto. Sono chiamati senza vincolarli a un oggetto.

I metodi sono oggetti di classe Method o UnboundMethod, a seconda che siano associati o non associati. Vedi la spiegazione here. I metodi non associati non possono essere chiamati fino a quando non sono associati a un oggetto.

lambda{|x| x}.class  # => Proc 
lambda{|x| x}.call(123) # => 123 

class Foo 
    def bar(baz) 
    baz 
    end 
end 

puts Foo.new.method(:bar).class  # => Method 
puts Foo.new.method(:bar).call(123) # => 123 

puts Foo.instance_method(:bar).class  # => UnboundMethod 
puts Foo.instance_method(:bar).call(123) # => throws an exception 

È possibile bind un UnboundMethod a un oggetto e poi chiamarlo. Ma non è possibile effettuare lo bind a Proc su un oggetto. Gli oggetti Proc possono tuttavia catturare variabili locali nell'ambito circostante, diventando chiusure.

5

Proc e lambda sono entrambi oggetti a se stessi, con un metodo call che richiama effettivamente il blocco associato al proc (o lambda). Tuttavia, Ruby fornisce dello zucchero sintattico per richiamarli senza la chiamata esplicita a call.

+0

Sì, proc e lambdas sono entrambi oggetti Proc, ma cosa significano per "funzioni anziché metodi". E qual è la distinzione? –

+0

Significa che la frase nel mezzo del 6 ° paragrafo è imprecisa. –

+1

La differenza è in realtà che, quasi universalmente, procs e lambda vengono usati solo per il loro metodo di chiamata associato. Nessuno memorizza metodi o valori aggiuntivi con loro. Quindi, come dice Kaptajn Kold, possiamo usarli come useremmo le funzioni del primo ordine in altre lingue, anche se sono ancora veramente degli oggetti. – rampion