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

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

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

2 ответа

Решение

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.

Пример шаблона оформлениятаблицы отгрузки


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

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

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

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 это видно только тогда, когда автор кода проигрывает отчаянную битву со сложностью.

Другие вопросы по тегам