Зачем использовать методы вместо методов? - PullRequest
15 голосов
/ 19 марта 2012

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

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

Ответы [ 2 ]

10 голосов
/ 19 марта 2012

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.

8 голосов
/ 19 марта 2012

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


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

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

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

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, если ваши ключи не являются последовательностью маленьких целых чисел. Хотя неуклюжий шаблон проектирования case-selector встречается часто на всех языках, диспетчерская таблица процессов используется редко. Обычно можно сохранить результаты непосредственно в Array или Hash, а затем просто проиндексировать их напрямую. Но для чего-то сложного, вызов proc обеспечивает большую гибкость.

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

...