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