LINUX.ORG.RU

Запись и чтение значений из файла Ruby

 ,


0

1

Есть у меня хэш

k = {"a"=>1, "b" =>15}

Как лучше реализовать запись и чтение его в файл. Все мысли которые есть у меня - это преобразовать в Array, потом поэлементно сделать строчку, а при загрузке строчку преобразовывать в Array и потом в Hash. Но как-то это не красиво, есть ли вариант получше?

Ответ на: комментарий от Lorchanin

IO.write - такого метода нету у IO,а при записии (ruby1.8) через

f = File.new @filename, 'w'
f.write

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

Bobrius
() автор топика
Ответ на: комментарий от Bobrius

IO.write - такого метода нету у IO

[15] pry(main)> RUBY_VERSION
=> "2.0.0"

Хэш сохраняется без каких либо знаков, разделяющих символы

d@deb:~$ cat qwer
{"a"=>1, "b"=>15}

А вообще слушай первого оратора, я набыдлокодил.

Т.е. делай

Marshal.dump k  #результат пиши в файл
k=Marshal.load (IO.read "file")

Lorchanin
()

Если кто найдет эту тему:

Marshal.dump(a) - Делает строку из объекта Marshal.load(«а») - Делает из строки объект

Всем спасибо, задача решена

Bobrius
() автор топика
Ответ на: комментарий от Bobrius

[holywar=ON] А в уютном лиспе сериализация изкоробки. Всё, что пишет writer может считать reader.

Конечно ascii, конечно все пишут велосипеды, НО!

ziemin ★★
()
Ответ на: комментарий от Deleted

Но зачем?

Не привык к ограничениям. Если сериализация, то всё и сразу. А ты давно с винды слез? Не отвык ещё небось?

ziemin ★★
()
Ответ на: комментарий от ziemin

Если бы ты не привык к ограничениям ты бы щас рассказывал про асм/си ,а не про лисп хрен пойми какой реализации.

st4l1k ★★
()
Ответ на: комментарий от st4l1k

Я разве отзывался плохо о асме или c? Ну и да - я пользуюсь clisp.

ziemin ★★
()
Ответ на: комментарий от ziemin

так переопредели writer. c сериализацией. Я так понял вся фишка в том, что с сериализацией мы на выходе имеем файл с нечитаемыми символами

С сериализацией
irb(main):007:0> Marshal.dump({"a"=>"aa"})
=> "\004\b{\006\"\006a\"\aaa" 

а в случае простой записи, все символы будут читаться в редакторе текстов

Без сериализации
irb(main):011:0> ({"a"=>"aa"}).to_s
=> "aaa"

Что эти способы записи не впутаны в один метод, по мне кажется правильно

Bobrius
() автор топика
Ответ на: комментарий от ziemin

ага на счет ограничений, ограничение можно обойти переписав функцию write на такую, что он делал сериализацию всех обектов кроме «String», а то что в write изначально нет сериализации изначально, мне кажется что это правильное решение.

Bobrius
() автор топика
Ответ на: комментарий от Bobrius

а то что в write изначально нет сериализации изначально, мне кажется что это правильное решение.

В лиспе сериализация есть изначально изначально. И я думаю это правильное решение.

ziemin ★★
()
Ответ на: комментарий от Bobrius

Красота лиспа в том (ИМХО), что и программа и данные выглядят идентично. Именно поэтому такие принципы, как «программа, управляемая данными», «сериализация» и т.д. и т.п. в лиспе были по-определению. А современные школоязыки помаленьку осваивают. Не в полном объёме и, иногда глупым образом.

ziemin ★★
()
Ответ на: комментарий от ziemin

что и программа и данные выглядят идентично

Одинаково безобразно, да.

А современные школоязыки

Иксперд в треде, все на виндус!

Deleted
()
Ответ на: комментарий от Deleted

Ты упорот.

Лучше и не скажешь. Не буду больше ничего говорить. Понимаю, что тяжелое детство, игрушки, прибитые к полубейсик...

ziemin ★★
()
Ответ на: комментарий от Deleted

Я не зверь. В том числе не считаю себя гением. Но спрошу (претендуя на "експерта", естественно): А что лучше?

ziemin ★★
()
Ответ на: комментарий от ziemin

Это такой замаскированный вопрос про серебряную пулю? На него пока ответа ещё никто не придумал.

Deleted
()
Ответ на: комментарий от Deleted

Существующая ситуация с (a) ядром,(b) драйверами, (c) десктопом, и платформами тебя устраивает? Весь смысл моих постов был в том, что ещё 60 лет назад всё уже было продумано до мелочей!

ziemin ★★
()
Ответ на: комментарий от ziemin

А что-то должно не устраивать? C в одном случае и C++ в другом и всем хорошо. Ну, первым не очень хорошо, зато память не жрёт и не тормозит.

Deleted
()
Ответ на: комментарий от ziemin

Я не против C

быстрофикс. Чёртова островная влавиатура.

ziemin ★★
()
Ответ на: комментарий от Deleted

Запятую не смог поставить.

Островные клавиатуры *мно

ziemin ★★
()
Ответ на: комментарий от buddhist

Напиши браузер на лиспе, чо. Браузеры жрут не потому, что написаны на C или C++, работа у них такая. Как думаешь, что происходит, когда надо СКОРОСТЬ-СКОРОСТЬ, что становится жертвой? :}

Deleted
()

YAML имеет явные преимущества перед marshal.

require 'yaml'

k = {"a"=>1, "b" =>15}
File.open('blablabla.yml', 'w'){ |f| f.write(k.to_yaml) }

k = YAML.load_file('blablabla.yml')
 => {"a"=>1, "b"=>15}
mamantoha
()
Ответ на: комментарий от mamantoha

с ним нужно осторожней - пара недавних критических уязвимостей в Rails была связана как раз-таки с джемом yaml.

NOX
()
Ответ на: комментарий от mv

Ну и вот. А сейчас чего только нет…

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.