你可以在Ruby中一行创建/写/附加一个字符串

tim*_*one 14 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 
Run Code Online (Sandbox Code Playgroud)

无需在实例上执行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>
Run Code Online (Sandbox Code Playgroud)

dbe*_*hur 44

Ruby IO::write自1.9.3以来就已经有了.您的编辑显示您传递了错误的参数.第一个arg是文件名,第二个是要写的字符串,第三个是可选的偏移量,第四个是可以包含传递给open的选项的哈希.由于您要追加,您需要将偏移量作为文件的当前大小传递以使用此方法:

File.write('some-file.txt', 'here is some text', File.size('some-file.txt'), mode: 'a')
Run Code Online (Sandbox Code Playgroud)

从讨论线程中提升: 此方法存在附加的并发问题,因为偏移的计算本质上是有效的.这段代码首先会发现大小是X,打开文件,寻找X并写入.如果另一个进程或线程写入到File.size内部搜索/写入之间的末尾File::write,我们将不再附加并将覆盖数据.

如果使用'a'模式打开文件并且不搜索,则保证从为fopen(3)O_APPEND定义的POSIX语义向末尾写入; 所以我推荐这个:

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


ako*_*nov 10

为了说清楚,因为一些评论建议我测试这个工作: IO.write("/tmp/testfile", "gagaga\n", mode: 'a')

那个附加到文件而不需要计算偏移量.Rubydoc有点误导.这是一个错误:https: //bugs.ruby-lang.org/issues/11638