2009-08-05 13 views
42

Quando deve essere utilizzato un lambda o un proc. Li ho visti descritti come funzioni anonime, ma sto lottando per capire questo concetto. Gradirei qualsiasi link o esempio su quando potresti usarne uno in Ruby, ma specialmente in Ruby on Rails.Quando usare un lambda in Ruby on Rails?

risposta

39

http://augustl.com/blog/2008/procs_blocks_and_anonymous_functions/ ha un run-down di ciò che i blocchi/procs/lambda sono, come è possibile utilizzarli e il loro confronto con le funzioni in altre lingue. Sicuramente risponde alla tua domanda.

fare essere consapevoli del fatto che l'ultima sezione 'Una nota sul lambda' parla di un punto che è vero solo in Ruby 1.8 e ha cambiato in 1,9 - Ruby: Proc.new { 'waffles' } vs. proc { 'waffles' }

+1

fissi di nuovo. Grazie;) –

+0

Link è morto di nuovo – JeffC

+1

Bleh, scusa ancora, ancora. Risolverà. –

3

lambda è eccezionalmente utile in named_scope, in modo che sia possibile passare i parametri a named_scopes.

9

Non vedo dove si effettua la distinzione tra Ruby on Rotaie e Rubino. Se stai scrivendo un'applicazione Ruby on Rails, stai scrivendo il codice Ruby, quindi se è utile in Ruby, dovrebbe essere utile in Ruby on Rails.

In ogni caso, questo articolo, Some Useful Closures in Ruby, dovrebbe essere utile, così come questo: http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/

+0

Buon punto. Una sorta di foglio di trucchi che elencava tutti i metodi incorporati che prendevano lambda poteva avere un senso, ma se capisci cos'è un lambda, non hai bisogno di un foglio di questo tipo. –

6

Si tratta di un pezzo di codice che permette di passare intorno.

E 'particolarmente utile in named_scope, permette di fare qualcosa di simile:

named_scope :scoped_by_user, lambda {|user| {:conditions=>{:user_id=>user.id}}} 

Diciamo che avete un modello di progetto e si desidera ottenere tutti i progetti per un particolare utente, si può fare qualcosa in questo modo:

Project.scoped_by_user(123) 
5

Dove ho visto Lambda utilizzata è in fase di test ...

lambda do 
    post :create, :user => @attr 
end.should_not change(User, :count) 

Lambda ti permette di avere quel test alla fine per assicurarti che il codice eseguito nel blocco lambda non cambi il conto dell'utente.

5

Che cos'è lambda?

Prova questo con il vostro irb.

lam = lambda { puts "Hello world"} 
lam.class 

#output is 
=> Proc 

lambda in ruby ​​è anche un esempio di classe Proc. lambda sono un diverso sapore di procs.

Che cos'è Proc?

Gli oggetti proc sono blocchi di codice che sono stati associati a un insieme di variabili locali.

proc = Proc.new { puts "Hello World" } 
proc.call 

#output is 
=> Hello World 

Qual è la differenza tra un proc e lambda?Il confronto spiegherà gli impieghi

Lambdas controlla il numero di argomenti, mentre i proc non lo fanno.

multiply = lambda { |x,y| x*y } 
multiply.call(2,3) #=>6 
multiply.call(2) #ArgumentError: wrong number of arguments (1 for 2) 

multiply = Proc.new {|x| x*x} 
multiply.call(2) # =>4 
multiply.call(2,3) # =>4 (It ignore the second argument) 

lambda e delle PROC trattare il ‘ritorno’ parola chiave in modo diverso (Leggi l'articolo qui sotto per esempio)

Leggi questo grande articolo per ulteriori dettagli http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/