Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
10.1.34. Поиск файлов и каталогов
Ниже мы воспользовались стандартной библиотекой
find.rbrequire "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 listendfindfiles "/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. Доступ к данным более высокого уровня
Часто возникает необходимость хранить и извлекать данные более прозрачным способом. Модуль
MarshalPStoredbm10.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Недостаток такого подхода заключается в том, что не все объекты можно сохранить. Для объектов, включающих другие объекты низкого уровня, маршалинг невозможен. К числу таких низкоуровневых объектов относятся, в частности,
IOProcBindingМетод
Marshal.dumps = Marshal.dump(works)p s[0] # 4p s[1] # 8Обычно попытка загрузить такие данные оказывается успешной только в случае, если номера старших версий совпадают и номер младшей версии данных не больше младшей версии метода. Но если при вызове интерпретатора Ruby задан флаг «болтливости» (
verbosevТретий параметр
limitMarshal.dumpArgumentErrorFile.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)endFile.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
