# Изменения будут сохранены.
end
Внутри транзакции можно вызвать метод roots
, который вернет массив корней (или метод root?
, чтобы проверить принадлежность). Есть также метод delete
, удаляющий корень.
store.transaction do |s|
list = s.roots # ['my_array','my_hash']
if s.root?('my_tree')
puts 'Найдено my_tree.'
else
puts 'He найдено # my_tree.'
end
s.delete('my_hash')
list2 = s.roots # ['my_array']
end
10.2.5. Работа с данными в формате CSV
Имеется также библиотека FasterCSV, которую создал Джеймс Эдвард Грей III (James Edward Gray III). Как явствует из названия, она работает быстрее, к тому же имеет несколько видоизмененный и улучшенный интерфейс (хотя для пользователей старой библиотеки есть «режим совместимости»). Во время работы над книгой велись дискуссии о том, следует ли сделать библиотеку FasterCSV стандартной, заменив старую библиотеку (при этом ей, вероятно, будет присвоено старое имя).
Ясно, что это не настоящая база данных. Но более подходящего места, чем эта глава, для нее не нашлось.
Модуль CSV (csv.rb
) разбирает или генерирует данные в формате CSV. О том, что представляет собой последний, нет общепринятого соглашения. Автор библиотеки определяет формат следующим образом:
• разделитель записей: CR + LF;
• разделитель полей: запятая (,);
• данные, содержащие символы CR, LF или запятую, заключаются в двойные кавычки;
• двойной кавычке внутри двойных кавычек должен предшествовать еще один символ двойной кавычки ('→'');
• пустое поле в кавычках обозначает пустую строку (данные,'',данные);
• пустое поле без кавычек означает NULL (данные,,данные).
В настоящем разделе мы рассмотрим лишь часть функциональных возможностей библиотеки. Этого достаточно для введения в предмет, а самую актуальную документацию, как всегда, можно найти в сети (начните с сайта ruby-doc.org).
Начнем с создания файла. Чтобы вывести данные, разделенные запятыми, мы просто открываем файл для записи; метод open передает объект-писатель в блок. Затем с помощью оператора добавления мы добавляем массивы данных (при записи они преобразуются в формат CSV). Первая строка является заголовком.
require 'csv'
CSV.open('data.csv','w') do |wr|
wr << ['name', 'age', 'salary']
wr << ['mark', '29', '34500']
wr << ['joe', '42', '32000']
wr << ['fred', '22', '22000']
wr << ['jake', '25', '24000']
wr << ['don', '32', '52000']
end
В результате исполнения этого кода мы получаем такой файл data.csv
:
'name','age','salary'
'mark',29,34500
'joe',42,32000
'fred',22,22000
'jake',25,24000
'don',32,52000
Другая программа может прочитать этот файл:
require 'csv'
CSV.open('data.csv', ' r') do |row|
p row
end
# Выводится:
# ['name', 'age', 'salary']
# ['mark', '29', '34500']
# ['joe', '42', '32000']
# ['fred', '22', '22000']
# ['jake', '25', '24000']
# ['don', '32', '52000']
Этот фрагмент можно было бы записать и без блока, тогда метод open
просто вернул бы объект-читатель. Затем можно было бы вызвать метод shift
читателя (как если бы это был массив) для получения очередной строки. Но блочная форма мне представляется более естественной.
В библиотеке есть и более развитые средства, а также вспомогательные методы. Для получения дополнительной информации обратитесь к сайту ruby-doc.org или архиву приложений Ruby.
10.2.6. Маршалинг в формате YAML
Аббревиатура
Затребовав директивой require
библиотеку yaml
, мы добавляем в каждый объект метод to_yaml
. Поучительно будет посмотреть на результат вывода в этом формате нескольких простых и более сложных объектов.
require 'yaml'