Я новичок в программировании, и ruby - это мой первый реальный пробег в нем. Я получаю блоки, но procs кажутся легкой концепцией метода/функции - зачем их использовать? Почему бы просто не использовать метод?
Спасибо за вашу помощь.
Я новичок в программировании, и ruby - это мой первый реальный пробег в нем. Я получаю блоки, но procs кажутся легкой концепцией метода/функции - зачем их использовать? Почему бы просто не использовать метод?
Спасибо за вашу помощь.
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.
Зачем использовать 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, когда писатель кода теряет отчаянную битву со сложностью.