Вы можете создать/написать/добавить строку в файл в одной строке в Ruby

Можно ли это сделать?

v='some text'
w='my' + Time.new.strftime("%m-%d-%Y").to_s + '.txt'
File.write(w,v) # will create file if it doesn't exist and recreates everytime 

без необходимости делать File.open на экземпляре? Т.е. просто метод класса, который будет либо добавлять, либо создавать и писать? В идеале рубин 1.9.3 солнц.

ТНХ

Изменить 1

вот что я пробовал на основе документов. Я не видел rdoc, но видел другие примеры. Опять же, я просто спрашиваю, можно ли открыть файл в режиме добавления через File.write? ТНХ

irb(main):014:0> File.write('some-file.txt','here is some text',"a")
TypeError: can't convert String into Integer
    from (irb):14:in `write'
    from (irb):14
    from /usr/local/rvm/rubies/ruby-1.9.3-p392/bin/irb:13:in `<main>'
irb(main):015:0>


irb(main):015:0> File.write('some-file.txt','here is some text',O_APPEND)
NameError: uninitialized constant O_APPEND
    from (irb):15
    from /usr/local/rvm/rubies/ruby-1.9.3-p392/bin/irb:13:in `<main>'
irb(main):016:0>

Ответ 1

Ruby имел IO::write начиная с версии 1.9.3. Ваше редактирование показывает, что вы передаете неправильные аргументы. Первый arg - это имя файла, второе - строка для записи, третья - необязательное смещение, а четвертое - хэш, который может содержать опции для перехода к открытому. Поскольку вы хотите добавить, вам нужно передать смещение в качестве текущего размера файла для использования этого метода:

File.write('some-file.txt', 'here is some text', File.size('some-file.txt'), mode: 'a')

Подъем из обсуждения: Этот метод имеет concurrency проблемы для append, потому что вычисление смещения по своей сути является racy. Этот код сначала найдет размер X, откройте файл, найдите X и напишите. Если другой процесс или поток записывается в конец между File.size и seek/write внутри File::write, мы больше не будем добавлять и будем переписывать данные.

Если один открывает файл, используя режим 'a' и не ищет, то гарантированно будет записываться в конец из семантики POSIX, определенной для fopen ( 3) с O_APPEND; поэтому я рекомендую это вместо:

File.open('some-file.txt', 'a') { |f| f.write('here is some text') }

Ответ 2

Чтобы было ясно, что некоторые комментарии показывают, что я тестировал эту работу: IO.write("/tmp/testfile", "gagaga\n", mode: 'a')

Этот файл присоединяется к файлу без необходимости вычисления смещения. Rubydoc мало вводит в заблуждение. Вот ошибка об этом: https://bugs.ruby-lang.org/issues/11638

Ответ 3

File.open('my' + Time.new.strftime("%m-%d-%Y").to_s + '.txt', 'w') { |file| file.write("some text") }

Ответ 4

У МРТ уже есть этот метод (я буквально скопировал и вставил ваш код, и он работал), но в прошлый раз, когда я проверил, JRuby и Rubinius этого не сделали. Они могут теперь, мне не хочется устанавливать последние версии, чтобы увидеть.

http://rdoc.info/stdlib/core/IO.write