Ruby 1.8 и 2.3 по-разному обрабатывают массивы конфигурации YAML - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь обновить сервер, на котором есть сценарии 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, результатis:

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 Ответ

0 голосов
/ 15 декабря 2018

Что ж, похоже, все, что мне нужно было сделать, это заключить ключи YAML в кавычки, и теперь хеш-объект включает в себя подчеркивание в ключах, а остальная часть сценария работает!

...