11.2.6. Хранение кода в виде объекта
11.2.6. Хранение кода в виде объекта
Неудивительно, что Ruby предлагает несколько вариантов хранения фрагмента кода в виде объекта. В этом разделе мы рассмотрим объекты Proc, Method и UnboundMethod.
Встроенный класс Proc позволяет обернуть блок в объект. Объекты Proc, как и блоки, являются замыканиями, то есть запоминают контекст, в котором были определены.
myproc = Proc.new { |a| puts "Параметр равен #{а}" }
myproc.call(99) # Параметр равен 99
Кроме того, Ruby автоматически создает объект Proc, когда метод, последний параметр которого помечен амперсандом, вызывается с блоком в качестве параметра:
def take_block(x, &block)
puts block.class
x.times {|i| block[i, i*i] }
end
take_block(3) { |n,s| puts "#{n} в квадрате равно #{s}" }
В этом примере демонстрируется также применение квадратных скобок как синонима метода call. Вот что выводится в результате исполнения:
Proc
0 в квадрате 0
1 в квадрате 1
2 в квадрате 4
Объект Proc можно передавать методу, который ожидает блок, предварив имя знаком &:
myproc = proc { |n| print n, "... " }
(1..3).each(&myproc) # 1... 2... 3...
Ruby позволяет также превратить метод в объект. Исторически для этого применяется метод Object#method, который создает объект класса Method как замыкание в конкретном объекте.
str = "cat"
meth = str.method(:length)
a = meth.call # 3 (длина "cat")
str << "erpillar"
b = meth.call # 11 (длина "caterpillar")
str = "dog"
# Обратите внимание на следующий вызов! Переменная str теперь ссылается
# на новый объект ("dog"), но meth по-прежнему связан со старым объектом.
с = meth.call # 11 (длина "caterpillar")
Начиная с версии Ruby 1.6.2, можно также применять метод Module#instance_method для создания объектов UnboundMethod. С их помощью представляется метод, ассоциированный с классом, а не с конкретным объектом. Прежде чем вызывать объект UnboundMethod, нужно связать его с каким-то объектом. Результатом операции связывания является объект Method, который можно вызывать как обычно:
umeth = String.instance_method(:length)
m1 = umeth.bind("cat")
m1.call # 3
m2 = umeth.bind("caterpillar")
m2.call # 11
Явное связывание делает объект UnboundMethod интуитивно более понятным, чем Method.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
2.2. CSS и JavaScript в виде архивов
2.2. CSS и JavaScript в виде архивов Теперь давайте рассмотрим, каким образом лучше всего будет отдавать CSS- и JavaScript-файлы в архивированном виде. Для обеспечения корректного архивирования, по-видимому, наиболее общий подход будет заключаться в выполнении по порядку следующих
Совет 15: Хранение паролей
Совет 15: Хранение паролей Чем сложнее пароль, тем сложнее его подобрать. Чем проще пароль, тем проще его запомнить. Получается, пароль должен быть и сложным, и простым одновременно — парадокс, решить который не каждому под силу. Если совет с ассоциациями вам не подходит,
Понятия объекта и экземпляра объекта
Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —
Понятия объекта и экземпляра объекта
Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —
9.3. Хранение и запоминание паролей
9.3. Хранение и запоминание паролей Сгенерировать сложный пароль, как было показано, очень просто. Совсем иное дело – его запомнить, что практически невозможно, если, конечно, у вас не феноменальная память на разную абракадабру.Где же хранить пароль (точнее пароли – ведь их
Хранение фотографий
Хранение фотографий Особенно это касается фотографий. Их со временем скапливается все больше и больше, и чтобы найти нужную фотографию, порою тратится очень много времени. Я, например, для фотографий завела две папки. В одной — все фотографии разложены в хронологическом
14.4.2. Хранение переменных окружения в виде массива или хэша
14.4.2. Хранение переменных окружения в виде массива или хэша Важно понимать, что объект ENV — не настоящий хэш, а лишь выглядит как таковой. Например, мы не можем вызвать для него метод invert; будет возбуждено исключение NameError, поскольку такого метода не существует. Причина
6.8. Хранение объектов в упорядоченном виде
6.8. Хранение объектов в упорядоченном виде ПроблемаТребуется сохранить набор объектов в заданном порядке, например с целью доступа к упорядоченным диапазонам этих объектов без их пересортировки при каждом таком обращении.РешениеИспользуйте ассоциативный контейнер set,
6.9. Хранение контейнеров в контейнерах
6.9. Хранение контейнеров в контейнерах ПроблемаИмеется несколько экземпляров стандартного контейнера (list, set и т.п.) и требуется сохранить их в еще одном контейнере.РешениеСохраните в главном контейнере указатели на остальные контейнеры. Например, можно использовать map
ЗВУК В ЦИФРОВОМ ВИДЕ
ЗВУК В ЦИФРОВОМ ВИДЕ Начнем с поисков различий между аналоговым и цифровым звуком. Что есть звук? Правильно, колебания звуковых волн в пространстве. Для обработки и усиления звуковые колебания сначала преобразовываются в электрические, обрабатываются, а затем
Хранение данных
Хранение данных Практические всегда, когда приложение должно хранить данные во внешних файлах, неизбежны два процесса: парсинг (синтаксический разбор) при считывании данных и сериализация (создание физического выражения состояния объектов) при сохранении (рис. 1.2). Рис.
Хранение резервных копий
Хранение резервных копий В Word можно включить режим автоматического сохранения версии документа при каждом его закрытии. Это бывает полезно, если необходимо фиксировать информацию о том, кто и когда вносил исправления – например, если это юридический документ. Сделать
Хранение ноутбука
Хранение ноутбука Мобильный компьютер лучше всего держать в помещении с невысокой влажностью из-за возможности появления конденсата на материнской плате или другой микросхеме.Если вы работаете в пыльном помещении, то после выключения ноутбук нужно хранить в закрытом