Добавить массив в одну строку в новый файл и загрузить массив в одну строку - PullRequest
0 голосов
/ 08 апреля 2020

Эй, я пишу простую игру, в которой я хочу сохранить прогресс и загрузить его в другой момент. Один из элементов для сохранения - это массив. Я хочу сохранить этот массив в одну строку в виде массива, а также загрузить его снова в виде массива, но он берет только первый элемент, а следующие элементы перезаписывают дополнительное содержимое

Пример (неверно) - Сохранить данные

player_1 = "name"
array = [1, 2, 3]
count = 1000
File.open("game.txt", "w+")  do |file|
  file.puts player_1
  file.puts array
  file.puts count
end

Пример (неверно) - Загрузить данные

file_data = File.open("game.txt").readlines.map(&:chomp)

player_1 = file_data[0]
array = file_data[1]
count = file_data[2]

ВЫХОД: TEXTFILE

name
1
2
3
1000

Поэтому я преобразовал массив в строку и записал ее в текст файл (работает, но кажется неудобным)

для сохранения массива

file.puts double_checker.to_s

# Output: String
"[1, 2, 3]"

для загрузки массива (загрузка строки из текстового файла, удаление специальных символов, преобразование ее обратно в массив, преобразование элементов в целые числа)

# Converts String back to Array, digits convert to Integers
double_checker = double_checker.delete(" []").split(",").map { |s| s.to_i }


# Output: Array
[1, 2, 3]

Теперь мой вопрос: есть ли способ сохранить массив непосредственно в текстовый файл (в одну строку) и прочитать его таким же образом, чтобы я мог сохранить массив прямо в переменная?

Или можно хранить строки только в текстовом файле?

Я пытаюсь выяснить, как можно использовать запись / чтение для сохранения и загрузки файлов, например, игры прогресс.

1 Ответ

2 голосов
/ 08 апреля 2020

Один из вариантов - использовать Marshal :: dump и Marshal :: load .

player_1 = "name"
array = [1, 2, 3]
count = 1000

File.open("game.txt", 'wb') do |f|
  f.write(Marshal.dump([player_1, array, count]))
end
  #=> 28

player_1, array, count = Marshal.load(File.binread("game.txt"))
  #=> ["name", [1, 2, 3], 1000] 

Обратите внимание, что не гарантируется, что объект, сериализованный с использованием dump с одной версией Ruby, будет доступен для чтения с load с более поздней версией Ruby. С другой стороны, Marshal может использоваться для сериализации широкого диапазона Ruby объектов.

"Библиотека маршалинга преобразует коллекции Ruby объектов в поток байтов" Вот почему сериализованные объекты Marshal должны записываться и считываться из двоичных файлов.

Другой вариант - использовать JSON # generate и JSON # parse .

require 'json'

File.write("game.txt", JSON.generate([player_1, array, count]))
  #=> 21

player_1, array, count = JSON.parse(File.read("game.txt"))
  #=> ["name", [1, 2, 3], 1000]

Можно альтернативно используйте JSON :: Ext :: Generator :: GeneratorMethods :: Array # to_ json для сериализации массива:

player_1, array, count].to_json
  #=> "[\"name\",[1,2,3],1000]" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...