Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
puts str.to_yamlputs num.to_yamlputs arr.to_yamlputs hsh.to_yaml# Выводится:# --- "Hello, world"# --- 237# ---# - Jan# - Feb# - Mar# - Apr# ---# just a: hash.# This: isОбратным по отношению к
to_yamlYAML.loadПредположим, что имеется такой файл
data.yaml---- "Hello, world"- 237- - Jan - Feb - Mar - Apr- just a: hash. This: isЭто те же четыре элемента данных, которые мы видели раньше, только они сгруппированы в единый массив. Если загрузить этот поток, то получим массив-
require 'yaml'file = File.new("data.yaml")array = YAML.load(file)file.closep array# Выводится:# ["Hello, world", 237, ["Jan", "Feb", "Mar", "Apr"],# {"just a"=>"hash.", "This"=>"is"} ]В общем и целом YAML — еще один способ выполнить маршалинг объектов. На верхнем уровне его можно использовать для самых разных целей. Например, человек может не только читать данные в этом формате, но и редактировать их, поэтому его естественно применять для записи конфигурационных файлов и т.п.
YAML позволяет и многое другое, о чем мы не можем здесь рассказать. Дополнительную информацию вы найдете на сайте ruby-doc.org или в справочном руководстве.
10.2.7. Преобладающие объекты и библиотека Madeleine
В некоторых кругах популярна идея преобладающих объектов (object prevalence). Смысл ее в том, что память дешева и продолжает дешеветь, а базы данных в большинстве своем невелики, поэтому о них можно вообще забыть и хранить все объекты в памяти.
Классической реализацией является пакет Prevayler, написанный на языке Java. Версия для Ruby называется Madeleine.
Madeleine годится не для всех приложений. У методики преобладающих объектов есть собственные правила и ограничения. Все объекты должны, во-первых, помещаться в памяти; во-вторых, быть сериализуемы.
Объекты должны быть детерминированы, то есть вести себя одним и тем же образом при получении одних и тех же данных. (Следовательно, применение системного таймера или случайных чисел оказывается под вопросом.)
Объекты должны быть по возможности изолированы от ввода/вывода (файлов и сети). Обычно весь ввод/вывод выполняется вне системы преобладающих объектов.
Наконец, любая команда, которая изменяет состояние системы преобладающих объектов, должна иметь вид объекта-команды (то есть для таких объектов тоже должна иметься возможность сериализации и сохранения).
Madeleine предлагает два основных метода доступа к системе объектов. Метод
execute_queryexecute_commandОба метода принимают в качестве параметра объект
CommandexecuteРабота системы состоит в том, что во время исполнения приложения она периодически делает моментальные снимки всей системы объектов. Команды сериализуются наравне с другими объектами. В настоящее время не существует способа «откатить» набор транзакций.
Трудно привести содержательный пример использования этой библиотеки. Если вы знакомы с Java-версией, рекомендую изучить API для Ruby и освоить ее таким образом. Хороших руководств нет — может быть, вы напишете первое.
10.2.8. Библиотека DBM
DBMdbmДля использования этого класса нужно создать объект DBM, указав для него имя файла, а дальше работать с ним, как с обычным хэшем. По завершении работы файл следует закрыть.
require 'dbm'd = DBM.new("data")d["123"] = "toodle-oo!"puts d["123"] # "toodle-oo!"d.closeputs d["123"] # RuntimeError: закрытый DBM-файл.e = DBM.open("data")e["123"] # "toodle-oo!"w=e.to_hash # {"123"=>"toodle-oo!"}e.closee["123"] # RuntimeError: закрытый DBM-файл.w["123"] # "toodle-oo!Интерфейс к DBM реализован в виде одного класса, к которому подмешан модуль
Enumerablenewopenq=DBM.new("data.dbm") #f=DBM.open("data.dbm") # Errno::EWOULDBLOCK: # Try again - "data.dbm"
