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