Когда следует использовать лямбда или proc? Я видел их как анонимные функции, но я изо всех сил пытаюсь понять эту концепцию. Я был бы признателен за любые ссылки или примеры того, когда вы можете использовать их в Ruby, но особенно в Ruby on Rails.
Когда использовать лямбду в Ruby on Rails?
Ответ 1
http://augustl.com/blog/2008/procs_blocks_and_anonymous_functions/ имеет сокращение тех блоков /procs/lambdas, как вы можете их использовать и как они сравниваются к функциям на других языках. Это определенно отвечает на ваш вопрос.
Помните, что в последнем разделе "Заметка о лямбдах" упоминается точка, которая верна только в Ruby 1.8 и изменена в версии 1.9 - Ruby: Proc.new {'waffles' } vs. proc {'waffles'}
Ответ 2
Я не вижу, где вы делаете различие между Ruby on Rails и Ruby. Если вы пишете приложение Ruby on Rails, вы пишете Ruby-код, поэтому, если это полезно в Ruby, оно должно быть полезно в Ruby on Rails.
В любом случае, эта статья, Некоторые полезные закрытия в Ruby, должна быть полезной, а также: http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/
Ответ 3
Это фрагмент кода, который позволяет вам пройти.
Это особенно полезно в named_scope, он позволяет вам сделать что-то вроде этого:
named_scope :scoped_by_user, lambda {|user| {:conditions=>{:user_id=>user.id}}}
Скажите, что у вас есть модель проекта, и вы хотите получить все проекты для одного конкретного пользователя, вы можете сделать что-то вроде этого:
Project.scoped_by_user(123)
Ответ 4
Где я видел, что Lambda используется в тестировании...
lambda do
post :create, :user => @attr
end.should_not change(User, :count)
Lambda позволяет вам провести этот тест в конце, чтобы убедиться, что код, выполняемый в блоке лямбда, не изменит значение пользователя.
Ответ 5
Что такое лямбда?
Попробуйте сделать это с помощью irb.
lam = lambda { puts "Hello world"}
lam.class
#output is
=> Proc
lambda в ruby также является экземпляром класса Proc. лямбды - это другой аромат проков.
Что такое Proc?
Объекты Proc - это блоки кода, привязанные к набору локальных переменных.
proc = Proc.new { puts "Hello World" }
proc.call
#output is
=> Hello World
В чем разница между proc и лямбдой? Сравнение будет объяснять использование
Lambdas проверяет количество аргументов, а procs - нет.
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 и procs обрабатывают ключевое слово return по-разному (Например, прочтите статью ниже)
Прочтите эту замечательную статью для более подробной информации http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/
Ответ 6
lambda исключительно полезен в named_scope
, поэтому вы можете передавать параметры named_scopes
.