Как будет выглядеть программа в Ruby, если она создаст хеши и сохранит эти хеши в другом файле? - PullRequest
0 голосов
/ 28 мая 2020

Я действительно новичок в программировании на Ruby, и я не могу найти в inte rnet ничего, связанного с программами, которые создают хэши и сохраняют их в другом файле. Как будет выглядеть код для такого файла .rb?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Почти для любого объекта x, но обязательно включая Ha sh, вы можете использовать

s=Marshal.dump(x)

, чтобы создать внутреннее представление объекта, имеющего тип String, и сохранить его. в файл. Если позже вы загрузите String обратно из файла и выполните команду

x=Marshal.load(s)

, вы можете воссоздать свой объект. Я предпочитаю это подходу JSON, описанному Максом Плейнером в его превосходном ответе, потому что (если вы примените его к своему Ha sh) он работает, даже если значения Ha sh являются экземплярами произвольных классов, которые вы создали , где нет стандартного форматирования, предлагаемого JSON. Marshal даже сохраняет / восстанавливает "замороженное" состояние объекта, чего JSON не может сделать.

С другой стороны, недостатком Marshal является то, что вам нужно воссоздавать данные с Программа Ruby, а JSON - это стандартизированный формат, который может обрабатываться другими приложениями. Более того, не гарантируется совместимость формата Marshal между различными основными Ruby версиями, поэтому, если это проблема для вас, не используйте его.

Еще один формат передачи - YAML; концепция такая же, как и в случае с Marshal, но работает немного медленнее, и, как и в случае с JSON, она не работает для произвольных типов внутри вашего Ha sh, если вы сами не предоставите подходящие методы передачи. Как и JSON, YAML можно читать из других приложений, и для людей я считаю его немного легче читать, чем JSON:

require 'yaml'
s = YAML.dump(x)

восстановление с помощью:

x = YAML.load(s)
1 голос
/ 28 мая 2020

Обычно Ruby хэши не записываются непосредственно в файл. Мы используем форматы сериализации, такие как JSON или YAML, чтобы файл мог быть прочитан другими языками программирования и инструментами, помимо Ruby.

Давайте возьмем JSON в качестве примера, так как он наиболее распространен. Мы можем читать / писать из JSON легко

require 'json'

path = "path.json"
hsh = { a: 1, b: 2 }

# Write to the file

File.open(path, "w") do |file|
  file.write hsh.to_json
end

# Read from the file

hsh2 = JSON.parse(File.read(path))

# let's print them out for inspection

print hsh
# => {:a=>1, :b=>2}

print hsh2
# => {"a"=>1, "b"=>2}

Как видите, хэши технически не идентичны , и это потому, что JSON не имеет symbol тип данных (YAML, кстати, умеет). Но они содержат те же данные.


Обратите внимание, в ответ на ваш комментарий о цели здесь. То, что вы просите, - это формат сериализации данных, читаемый человеком и, к счастью, JSON и YAML оба удобочитаемы и используются постоянно для этой цели.

Для использования YAML, просто require 'yaml' и замените вызовы to_json и JSON.parse в предыдущем примере на to_yaml и YAML.load соответственно. YAML по умолчанию очень удобен для чтения человеком, и я бы поискал руководство по его синтаксису, чтобы познакомиться с ним.

to_json по умолчанию не так читается, так как он выводит все в одной строке, но вы можете использовать вместо него JSON.pretty_generate(hsh), и это сделает вещи намного лучше.

...