Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
10.1.34. Поиск файлов и каталогов
Ниже мы воспользовались стандартной библиотекой
find.rb
require "find"
def findfiles(dir, name)
list = []
Find.find(dir) do |path|
Find.prune if [".",".."].include? Path
case name
when String
list << path if File.basename(path) == name
when Regexp
list << path if File.basename(path) =~ name
else
raise ArgumentError
end
end
list
end
findfiles "/home/hal", "toc.txt"
# ["/home/hal/docs/toc.txt", "/home/hal/misc/toc.txt"]
findfiles "/home", /^[a-z]+.doc/
# ["/home/hal/docs/alpha.doc", "/home/guy/guide.doc",
# "/home/bill/help/readme.doc"]
10.2. Доступ к данным более высокого уровня
Часто возникает необходимость хранить и извлекать данные более прозрачным способом. Модуль
Marshal
PStore
dbm
10.2.1. Простой маршалинг
Часто бывает необходимо создать объект и сохранить его для последующего использования. В Ruby есть рудиментарная поддержка для обеспечения устойчивости объекта или маршалинга. Модуль
Marshal
# Массив элементов [composer, work, minutes]
works = [["Leonard Bernstein","Overture to Candide",11],
["Aaron Copland","Symphony No. 3",45],
["Jean Sibelius","Finlandia",20]]
# Мы хотим сохранить его для последующего использования...
File.open("store","w") do |file|
Marshal.dump(works,file)
end
# Намного позже...
File.open("store") do |file|
works = Marshal.load(file)
end
Недостаток такого подхода заключается в том, что не все объекты можно сохранить. Для объектов, включающих другие объекты низкого уровня, маршалинг невозможен. К числу таких низкоуровневых объектов относятся, в частности,
IO
Proc
Binding
Метод
Marshal.dump
s = Marshal.dump(works)
p s[0] # 4
p s[1] # 8
Обычно попытка загрузить такие данные оказывается успешной только в случае, если номера старших версий совпадают и номер младшей версии данных не больше младшей версии метода. Но если при вызове интерпретатора Ruby задан флаг «болтливости» (
verbose
v
Третий параметр
limit
Marshal.dump
ArgumentError
File.open("store","w") do |file|
arr = []
Marshal.dump(arr,file,0) # Внутри 'dump': превышена пороговая глубина.
# (ArgumentError)
Marshal.dump(arr,file,1)
arr = [1, 2, 3]
Marshal.dump(arr,file,1) # Внутри 'dump': превышена пороговая глубина.
# (ArgumentError)
Marshal.dump(arr,file,2) arr = [1, [2], 3]
Marshal.dump(arr,file,2) # Внутри 'dump': превышена пороговая глубина.
# (ArgumentError)
Marshal.dump(arr,file,3)
end
File.open("store") do |file|
p Marshal.load(file) # [ ]
p Marshal.load(file) # [1, 2, 3]
p Marshal.load(file) # arr = [1, [2], 3]
end
По умолчанию третий параметр равен 1. Отрицательное значение означает, что глубина вложенности не проверяется.
10.2.2. Более сложный маршалинг
Иногда мы хотим настроить маршалинг под свои нужды. Такую возможность дают методы
_load
_dump