Каков пример использования Proc или Lambda в веб-приложении на Ruby? - PullRequest
1 голос
/ 16 сентября 2009

Мне трудно представить себе практическое использование Procs и Lambdas в веб-приложении. У кого-нибудь есть пример ситуации в вашем коде, где они пригодятся?

Ответы [ 4 ]

5 голосов
/ 16 сентября 2009

Почему именно в веб-приложениях? Возможно, вы имеете в виду среду Ruby on Rails?

Procs и lambdas полезны, когда вы хотите хранить части кода анонимно. Procs и lambdas очень похожи на методы, за исключением того, что у них нет имени. Хороший пример, чтобы проиллюстрировать это, в ActiveRecord / Rails:

// methods are named
validates_presence_of :foo, :if => :active?

// procs aren't
validates_presence_of :foo, :if => proc {|r| do_stuff }

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

Вы можете найти эту статью полезной.

3 голосов
/ 16 сентября 2009

Я использую их в именованных областях:

named_scope: last, лямбда {| количество | {: order => "made_at DESC",: limit => количество}}

Чтобы создать простой способ получить последние НОМЕР сообщения, комментарии и т. Д.

Теперь, я вроде как обманул, это скорее фреймворк, чем "веб-приложение", но я не могу думать, что веб-приложение отличается от других настольных приложений. И Procs, и Lambdas позволяют вам «сохранять» код для последующего использования, а также могут помочь в использовании поведения, использовании более «ориентированных на домен» методов и очистке более «обычного кода»

1 голос
/ 16 сентября 2009

Очевидно, что проки и лямбды являются необходимым компонентом всего, что связано с обратными вызовами, но в большинстве случаев в ruby ​​это может быть выполнено с помощью блока.

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

В моем случае у меня был объект (publist), который содержал список строк. В одной области кода мне нужно было многократно проверять, есть ли в этом списке другие члены. Было бы неудобно и иметь низкую производительность изменять тип данных, чтобы объект содержал набор. Поэтому я создал метод, который возвращал лямбду-сопоставитель с локальным представлением набора этого списка.

Я мог бы вернуть набор, но бизнес-логика того, соответствует ли элемент логически списку публикации. Я мог бы в будущем изменить это, чтобы поддерживать подстроки или регулярные выражения, и пользователи matcher будут по-прежнему иметь тот же API.

1 голос
/ 16 сентября 2009

Использование lambda или proc - это вопрос стиля программирования, называемого функциональным программированием. В Rails есть несколько интерфейсов, где вы можете передать блочный объект (lambda или procc), например validations :

class Person < ActiveRecord::Base
  validates_acceptance_of :terms_of_service :if => Proc.new { |user| user.signup_step > 2 }
end

Вы можете спроектировать некоторые интерфейсы, подобные этим, где вы можете дать пользователю возможность либо передать имя метода (символ), либо объект proc (или лямбду), чтобы указать некоторую логику.

В другом месте, например, в Rails, вы можете динамически установить макеты :

class WeblogController < ActionController::Base
  layout proc{ |controller| current_user.logged_in? ? "writer_layout" : "reader_layout" }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...