Когда использовать лямбду в Ruby on Rails? - PullRequest
47 голосов
/ 05 августа 2009

Когда следует использовать лямбду или процесс? Я видел их описанными как анонимные функции, но я изо всех сил пытаюсь понять эту концепцию. Буду признателен за любые ссылки или примеры, когда вы можете использовать один в Ruby, но особенно в Ruby on Rails.

Ответы [ 7 ]

42 голосов
/ 05 августа 2009

http://augustl.com/blog/2008/procs_blocks_and_anonymous_functions/ содержит сведения о том, что такое блоки / procs / lambdas, как их использовать и как они сравниваются с функциями на других языках. Это определенно отвечает на ваш вопрос.

Имейте в виду, что в последнем разделе «Записка о лямбдах» упоминается точка, которая верна только в Ruby 1.8 и изменена в 1.9 - Ruby: Proc.new {'waffles'} против proc {'waffles '}

12 голосов
/ 05 августа 2009

Я не понимаю, где вы проводите различие между 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/

8 голосов
/ 26 сентября 2014

Что такое лямбда?

Попробуйте это с вашим irb .

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

#output is
=> Proc

Лямбда в ruby ​​также является экземпляром класса Proc. лямбды - это другой вкус проков.

Что такое Proc?

Объекты Proc - это блоки кода, которые были связаны с набором локальных переменных.

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

#output is
=> Hello World

В чем разница между процом и лямбдой? Сравнение объяснит случаи использования

Лямбды проверяют количество аргументов, а процы - нет.

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/

8 голосов
/ 07 августа 2009

Это кусок кода, который позволяет вам обойти.

Это особенно полезно в named_scope, оно позволяет вам делать что-то вроде этого:

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

Скажем, у вас есть модель проекта и вы хотите получить все проекты для одного конкретного пользователя, вы можете сделать что-то вроде этого:

Project.scoped_by_user(123)
7 голосов
/ 17 января 2011

Где я видел, что используется лямбда, в тестировании ...

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

Лямбда позволяет вам выполнить этот тест в конце, чтобы убедиться, что код, выполняемый в лямбда-блоке, не изменится и не изменит количество пользователей.

3 голосов
/ 05 августа 2009

лямбда исключительно полезна в named_scope, так что вы можете передавать параметры в named_scopes.

1 голос
/ 27 мая 2018

Многие опции validator принимают лямбду или Proc, если работа слишком проста, чтобы гарантировать именованную функцию. Например, :if и :unless.

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

:message примет Proc для пользовательских сообщений валидатора.

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

Как правило, лямбда-выражения (и обратные вызовы в целом) полезны в качестве упрощенного способа обеспечения большей возможности настройки, чем позволяет строка или число, но без необходимости писать полный класс пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...