Подтвердить что ты не робот

Зачем использовать procs вместо методов?

Я новичок в программировании, и ruby ​​- это мой первый реальный пробег в нем. Я получаю блоки, но procs кажутся легкой концепцией метода/функции - зачем их использовать? Почему бы просто не использовать метод?

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Proc - вызываемый фрагмент кода. Вы можете сохранить его в переменной, передать в качестве аргумента и в противном случае рассматривать его как первоклассное значение.

Почему бы просто не использовать метод?

В зависимости от того, что вы подразумеваете под "методом" здесь.

class Foo
  def bar
    puts "hello"
  end
end

f = Foo.new

В этом фрагменте кода метод bar довольно ограничен. Вы можете назвать это, и это так. Однако, если вы хотите сохранить ссылку на него (передать где-то еще и там позвонить), вы можете сделать это:

f = Foo.new
bar_method = f.method(:bar)

Здесь bar_method очень похож на лямбда (что похоже на Proc). bar_method является первоклассным гражданином, f.bar не является.

Для получения дополнительной информации прочитайте статью, указанную @minitech.

Ответ 2

Пример шаблона проектирования таблицы отправки


Зачем использовать procs вместо методов?

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

Общий шаблон проектирования включает в себя выбор метода или кодового блока для вызова на основе значения времени выполнения. Например...

case 1
  when 0
    p :a
  when 1
    p :b
  when 2
    p :c
end

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

h = [ proc { p :a }, proc { p :b }, proc { p :c } ]

h[1].call

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

Как вы продолжаете в Ruby, вы обнаружите, что это причина, по которой Ruby имеет блоки. Блоки - это, по существу, методы, которые были переданы в качестве параметра другому методу. Это так легко сделать в Ruby и Smalltalk, что он постоянно используется. Вы можете сделать то же самое в C, но это слишком неудобно, чтобы быть забавным, и поэтому это видно только на C, когда писатель кода теряет отчаянную битву со сложностью.