Când să folosiți un lambda în Ruby on Rails? (Programare, Ruby Pe Șine, Ruby)

Cameron a intrebat.

Când ar trebui să se folosească un lambda sau proc? Le-am văzut descrise ca fiind funcții anonime, dar mă străduiesc să înțeleg acest concept. Aș aprecia orice link-uri sau exemple de când ați putea folosi unul în Ruby, dar mai ales în Ruby on Rails.

7 răspunsuri
August Lilleaas

http://augustl.com/blog/2008/procs_blocks_and_anonymous_functions/ are o trecere în revistă a ceea ce sunt blocurile/proc/lambdas, cum le puteți folosi și cum se compară cu funcțiile din alte limbaje. Răspunde cu siguranță la întrebarea ta.

Rețineți că ultima secțiune „A note on lambdas” menționează un aspect care este valabil doar în Ruby 1.8 și care a fost modificat în 1.9 – Ruby: Proc.new { ‘napolitane’ } vs. proc { ‘napolitane’ }

Comentarii

  • Bleh, îmi pare rău din nou, din nou. Se va repara. –  > Por August Lilleaas.
ehsanul

Nu văd unde faci distincția între Ruby on Rails și Ruby. Dacă scrii o aplicație Ruby on Rails, scrii cod Ruby, deci dacă este util în Ruby, ar trebui să fie util în Ruby on Rails.

Oricum, acest articol, Câteva închideri utile în Ruby, ar trebui să vă fie de ajutor, precum și acesta: http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/

Comentarii

  • Bună observație. Un fel de foaie de înșelăciune care să listeze toate metodele încorporate care iau lambda ar putea avea un fel de sens, dar dacă înțelegi ce este un lambda, nu ai nevoie de o astfel de foaie de înșelăciune. –  > Por August Lilleaas.
MadNik

Ce este lambda?

Încercați acest lucru cu irb.

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

#output is
=> Proc

Lambda în Ruby este, de asemenea, o instanță a clasei Proc. Lambdas sunt o variantă diferită a procs.

Ce este Proc?

Obiectele Proc sunt blocuri de cod care au fost legate de un set de variabile locale.

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

#output is
=> Hello World

Care este diferența dintre un proc și lambda? Comparația va explica cazurile de utilizare

Lambdas verifică numărul de argumente, în timp ce procs nu o fac.

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)

Lambdas și procs tratează cuvântul cheie „return” în mod diferit(Citiți articolul de mai jos pentru un exemplu)

Citiți acest articol excelent pentru mai multe detaliihttp://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/

ez.

Este o bucată de cod care vă permite să transmiteți.

Este deosebit de utilă în named_scope, vă permite să faceți ceva de genul acesta:

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

Să spunem că aveți un model Project și doriți să obțineți toate proiectele pentru un anumit utilizator, puteți face ceva de genul acesta:

Project.scoped_by_user(123)

sudonim

Unde am văzut Lambda folosit este în teste…

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

Lambda vă permite să aveți acel test la sfârșit pentru a vă asigura că codul executat în blocul lambda nu modifică numărul de utilizatori.

ErsatzRyan

lambda este extrem de utilă în named_scope, astfel încât să puteți trece parametri către named_scopes.

Schwern

Multe validator acceptă un lambda sau Proc dacă activitatea este prea simplă pentru a justifica o funcție cu nume. De exemplu, :if și :unless.

validates :thing, presence: true, unless: ->(obj) { obj.something? }

:message vor accepta un Proc pentru mesajele personalizate ale validatorului.

validates :terms, acceptance: {
    message: ->(person) "%{person.name} must accept our terms!"
}

În general, lambdas (și callback-urile în general) sunt utile ca o modalitate ușoară de a permite o personalizare mai mare decât permite un șir de caractere sau un număr, dar fără ca utilizatorul să fie nevoit să scrie o clasă completă.