Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Конференция comp.lang.ruby
Архив приложений Ruby
rubyforge.org
ruby-doc.org
Есть и другие полезные ресурсы, особенно для тех, кто говорит по-японски. Трудно перечислять онлайновые ресурсы в печатном издании, поскольку они постоянно изменяются. Поисковая машина — ваш лучший друг.
11.3. Динамические механизмы
Скайнет осознал себя в 2:14 утра по восточному времени 29 августа 1997 года.
Многие читатели имеют опыт работы со статическими языками, например С. Им я адресую риторический вопрос: «Можете ли вы представите себе написанную на С функцию, которая принимает строку, рассматривает ее как имя переменной и возвращает значение этой переменной?»
Нет? А как насчет того, чтобы удалить или заменить определение функции? А перехватить обращения к несуществующим функциям? Или узнать имя вызывающей функции? Или автоматически получить список определенных пользователем элементов программы (например, перечень всех написанных вами функций)?
В Ruby все это возможно. Такая гибкость во время выполнения, способность опрашивать и изменять программные элементы во время выполнения намного упрощают решение задач. Утилиту трассировки выполнения, отладчик, профилировщик — все это легко написать на Ruby и для Ruby. Хорошо известные программы
irb
xmp
К подобным возможностям нужно привыкнуть, их легко употребить во вред. Все эти идеи появились отнюдь не вчера (они стары по крайней мере так же, как язык LISP) и считаются «проверенными и доказанными» в сообществах пользователей Scheme и Smalltalk. Даже в языке Java, который так многим обязан С и C++, есть некоторые динамические средства, поэтому мы ожидаем, что со временем их популярность будет только расти.
11.3.1. Динамическая интерпретация кода
Глобальная функция
eval
parameters = {}
ARGF.each do |line|
name, expr = line.split(/s*=s*/, 2)
parameters[name] = eval expr
end
Пусть на вход подаются следующие строки:
а = 1
b = 2 + 3
с = 'date'
Тогда в результате мы получим такой хэш:
{"а"=>1, "b"=>5,"с"=>"Mon Apr 30 21:17:47 CDT 2001n"}
eval
d= 'rm *'
В Ruby есть еще три метода, которые интерпретируют код «на лету»:
class_eval
module_eval
instance_eval
self
class_eval
hook_method
Trace
delegate.rb
Метод
eval
Ruby ассоциирует локальные переменные с блоками, с определениями высокоуровневых конструкций (класса, модуля и метода) и с верхним уровнем программы (кодом, расположенным вне любых определений). С каждой из этих областей видимости ассоциируются привязки переменных и другие внутренние детали. Наверное, самым главным потребителем информации о привязках является программа
irb
Можно инкапсулировать текущую привязку в объект с помощью метода
Kernel#binding
eval
def some_method
а = "local variable"
return binding
end
the_binding = some_method
eval "a", the_binding # "local variable"
Интересно, что информация о наличии блока, ассоциированного с методом, сохраняется как часть привязки, поэтому возможны такие трюки:
def some_method
return binding
end
the_binding = some_method { puts "hello" }
eval "yield", the_binding # hello
11.3.2. Метод const_get
Метод
const_get
str = "PI"
Math.const_get(str) # Значение равно Math::PI.
Это способ избежать обращения к методу
eval
instance_variable_set
instance_variable_get
define_method
Метод
const_get
eval
Истинная полезность метода
const_get
eval