Таблица отправки Пример шаблона проектирования
Зачем использовать методы вместо методов?
- Возможно, вы захотите определить один динамически, где поведение меняется
по параметрам.
- Возможно, вы захотите получить указатель на метод
так что вы можете ссылаться на него как на данные.
Обычный шаблон проектирования включает выбор метода или блока кода для вызова на основе значения времени выполнения. Например ...
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 это видно только тогда, когда автор кода проигрывает отчаянную битву со сложностью.