Ruby 1.8 и 2.3 по-разному обрабатывают массивы конфигурации YAML
Я пытаюсь обновить сервер, на котором есть сценарии ruby, разработанные другим человеком. Я разработчик perl / php и не мало разбираюсь в ruby, просто пытаюсь заставить работать скрипты, которые были разработаны с Ruby 1.8, и скрипты, кажется, ведут себя по-разному, обрабатывая массивы в более новой версии. Сценарий не сопоставлял повторяющиеся папки с массивом конфигурационных файлов с именами папок, и я полагаю, что все сводилось к тому, как файл конфигурации YAML преобразуется в массив. Я собрал этот простой скрипт:
require 'rubygems'
require 'yaml'
config_filename = File.expand_path(File.dirname(__FILE__) + "/testruby.yml")
@config = YAML.load(File.open(config_filename))
puts @config
Файл конфигурации YAML testruby.yml выглядит следующим образом:
1_01:
name: Monday Show
suffix: showM
program_id: 123
segment: 1
dated: false
1_02:
name: Monday Show
suffix: showM
program_id: 123
segment: 2
dated: false
1_03:
name: Tuesday Show
suffix: showT
program_id: 124
segment: 1
dated: true
Когда я запускаю это на исходном сервере с Ruby 1.8, результат:
1_03program_id124nameTuesday Showsegment1suffixshowTdatedtrue1_02program_id123nameMonday Showsegment2suffixshowMdatedfalse1_01program_id123nameMonday Showsegment1suffixshowMdatedfalse
Но когда запускается на новом сервере с Ruby 2.3, я получаю массив:
{101=>{"name"=>"Monday Show", "suffix"=>"showM", "program_id"=>123, "segment"=>1, "dated"=>false}, 102=>{"name"=>"Monday Show", "suffix"=>"showM", "program_id"=>123, "segment"=>2, "dated"=>false}, 103=>{"name"=>"Tuesday Show", "suffix"=>"showT", "program_id"=>124, "segment"=>1, "dated"=>true}}
Он даже удаляет подчеркивание из ключа имени папки в файле конфигурации. По этой причине позже в скрипте @config[1_01]
не совпадает конечно. Есть ли способ получить массив для сборки, как версия 1.9, чтобы остальная часть сценария работала как задумано?
Еще одна вещь, чтобы отметить, не уверен, если это связано с проблемой. require 'yaml'
строка не присутствовала в скрипте, я добавил после получения этой ошибки при запуске:
testruby.rb:4:in `<main>': uninitialized constant YAML (NameError)
1 ответ
Что ж, кажется, все, что мне нужно было сделать, это заключить ключи YAML в кавычки, и теперь хеш-объект включает в себя подчеркивание в ключах, а остальная часть сценария работает!