1.4.1. Кодирование во время выполнения

1.4.1. Кодирование во время выполнения

Мы уже упоминали директивы load и require. Важно понимать, что это не встроенные предложения и не управляющие конструкции; на самом деле это методы. Поэтому их можно вызывать, передавая переменные или выражения как параметры, в том числе условно. Сравните с директивой #include в языках С и C++, которая обрабатывается во время компиляции.

Код можно строить и интерпретировать по частям. В качестве несколько искусственного примера рассмотрим приведенный ниже метод calculate и вызывающий его код:

def calculate(op1, operator, op2)

 string = op1.to_s + operator + op2.to_s

 # Предполагается, что operator - строка; построим длинную

 # строку, состоящую из оператора и операндов.

 eval(string)                    # Вычисляем и возвращаем значение.

end

@alpha = 25

@beta = 12

puts calculate(2, "+",2)         # Печатается 4

puts calculate(5, "*", "@alpha") # Печатается 125

puts calculate("@beta", "**", 3) # Печатается 1728

Вот та же идея, доведенная чуть ли не до абсурда: программа запрашивает у пользователя имя метода и одну строку кода. Затем этот метод определяется и вызывается:

puts "Имя метода: "

meth_name = gets

puts "Строка кода: "

code = gets

string = %[def #{meth_name} #{code} end] # Строим строку.

eval(string) # Определяем метод.

eval(meth_name) # Вызываем метод.

Зачастую необходимо написать программу, которая могла бы работать на разных платформах или при разных условиях, но при этом сохранить общий набор исходных текстов. Для этого в языке С применяются директивы #ifdef, но в Ruby все определения исполняются. Не существует такого понятия, как «этап компиляции»; все конструкции динамические, а не статические. Поэтому для принятия решения такого рода мы можем просто вычислить условие во время выполнения:

if platform == Windows

 action1

elsif platform == Linux

 action2

else

 default_action

end

Конечно, за такое кодирование приходится расплачиваться некоторым снижением производительности, поскольку иногда условие вычисляется много раз. Но рассмотрим следующий пример, который делает практически то же самое, однако весь платформенно-зависимый код помещен в один метод, имя которого от платформы не зависит:

if platform == Windows

 def my_action

  action1

 end

 elsif platform == Linux

 def my_action

  action2

 end

 else

 def my_action

  default_action

 end

end

Таким способом мы достигаем желаемого результата, но условие вычисляется только один раз. Когда программа вызовет метод my_action, он уже будет правильно определен.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

15.8.2. Emacs и отладка во время выполнения

Из книги Основы информатики: Учебник для вузов автора Малинина Лариса Александровна

15.8.2. Emacs и отладка во время выполнения Для обнаружения ошибок времени выполнения Emacs предоставляет аналогичную возможность интеграции с символическим отладчиком, т.е. разработчик может использовать какой-либо Emacs-режим для установки контрольных точек в программах и


1.4. Кодирование информации

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

1.4. Кодирование информации В настоящее время во всех вычислительных машинах информация представляется с помощью электрических сигналов. При этом возможны две формы ее представления – в виде непрерывного сигнала (с помощью сходной величины – аналога) и в виде нескольких


15.8.2. Emacs и отладка во время выполнения

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

15.8.2. Emacs и отладка во время выполнения Для обнаружения ошибок времени выполнения Emacs предоставляет аналогичную возможность интеграции с символическим отладчиком, т.е. разработчик может использовать какой-либо Emacs-режим для установки контрольных точек в программах и


6.16.9 Кодирование вариантов

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

6.16.9 Кодирование вариантов Существуют два однобайтовых варианта, кодируемых следующим образом:No Operation 00000001End of Option List 00000000Оставшиеся варианты задаются несколькими битами. Каждый начинается октетом типа и октетом длины.Для рассматриваемых вариантов возникает следующий


6.16.13 Кодирование Timestamp

Из книги C++. Сборник рецептов автора Диггинс Кристофер

6.16.13 Кодирование Timestamp Вариант Timestamp (временная метка) содержит указатель, подполе переполнения и подполе флага. Подполе флага определяет один из трех возможных для временной метки форматов.Если в подполе флага содержится 0, то при каждом попадании в выделенном месте


15.11.2 Кодирование в XDR

Из книги PGP: Кодирование и шифрование информации с открытым ключом. автора Левин Максим

15.11.2 Кодирование в XDR Сообщения запросов и ответов для данной версии программы или процедуры имеют фиксированный формат. Тип данных поля определяется положением этого поля в сообщении. Длина каждого поля должна быть кратна 4 байт. Многие параметры представляются целыми


16.13.4 Кодирование содержания

Из книги Первые шаги с Windows 7. Руководство для начинающих автора Колисниченко Денис Н.

16.13.4 Кодирование содержания RFC 822 определил исходной формат для текстовых сообщений Интернета. Содержание почтового сообщения состоит из последовательности строк, завершающихся <CR><LF>. Максимальная длина каждой строки (включая <CR><LF>) определена в 1000


Глава 27 Динамическая загрузка во время выполнения

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Глава 27 Динамическая загрузка во время выполнения Загрузка разделяемых (совместно используемых) объектов во время выполнения может оказаться полезным способом для структурирования собственных приложений. Если правильно организовать этот процесс, то тогда можно будет


8.6. Определение типа объекта во время выполнения

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

8.6. Определение типа объекта во время выполнения ПроблемаВо время выполнения требуется динамически узнавать тип определенного класса.РешениеДля запроса, на объект какого типа указывает адрес объекта, используйте идентификацию типов во время выполнения (обычно


Кодирование сообщения.

Из книги C++ для начинающих автора Липпман Стенли

Кодирование сообщения. Мы рассмотрели, как использовать ключи. Теперь давайте попробуем использовать это для чего-нибудь интересного. Давайте посмотрим, как декодировать файл:pgp -е файл идентификаторПриведем пример: учитель хочет послать своему коллеге экзаменационные


2.4.2. Время установки Windows 7 и время жизни аккумулятора

Из книги автора

2.4.2. Время установки Windows 7 и время жизни аккумулятора Если вы устанавливаете Windows 7 на ноутбук или нетбук, желательно подключить его к сети питания. Если это невозможно, тогда лучше не начинать установку Windows. Хотя весь процесс установки занимает около 20–25 минут (во всяком


19.1. Идентификация типов во время выполнения

Из книги автора

19.1. Идентификация типов во время выполнения * RTTI позволяет программам, которые манипулируют объектами через указатели или ссылки на базовые классы, получить истинный производный тип адресуемого объекта. Для поддержки RTTI в языке C++ есть два оператора: оператор dynamic_cast