【问题标题】:Setting end-of-line character for puts设置puts的行尾字符
【发布时间】:2010-05-18 09:40:17
【问题描述】:

我有一组要打印的条目。

作为arr数组,我以前只是写:

puts arr

然后我需要使用DOS格式的行尾:\r\n,所以我写了:

arr.each { |e| print "#{e}\r\n" }

这可以正常工作,但我想知道是否有办法指定要使用的行尾格式,以便我可以编写如下内容:

$eol = "\r\n"
puts arr

更新 1

我知道 puts 将根据运行的平台使用正确的行尾,但我需要这个,因为我会将输出写入文件。

更新 2 正如 Mark 建议的那样,设置 $\ 很有用。无论如何,它只适用于 print。 例如,

irb(main):001:0> a = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> $\ = "\r\n"
=> "\r\n"
irb(main):003:0> print a
123
=> nil
irb(main):004:0> puts a
1
2
3
=> nil

print 在一行上打印所有数组项,然后添加 $\,而我想要 puts 的行为:添加 $\ 在数组的每一项之后。
如果不使用 Array#each,这可能吗?

【问题讨论】:

  • 不会根据平台添加回车吗?你能告诉我们你得到什么输出和你想要什么输出吗?
  • @philippe:是的,我知道,但我会将输出写入一个文本文件,我想用 CR/LF 行结尾存储该文件

标签: ruby


【解决方案1】:

Ruby 变量$\ 将为调用打印和写入设置记录分隔符:

>> $\ = '!!!'
=> "!!!"
>> print 'hi'
hi!!!=> nil

或者,如果您导入English 模块,您可以将$\ 称为$OUTPUT_RECORD_SEPARATOR


Kernel#puts 等价于STDOUT.puts;和IO.puts“在每个还没有以换行序列结尾的元素之后写一个换行符”。所以你对纯puts 不走运。但是,$, 变量是参数之间的分隔符字符串输出为Kernel#printArray#join。因此,如果您可以处理调用print arr.join,这可能是您正在做的最好的解决方案:

>> [1,2,3].join
=> "123"
>> $, = '---'
=> "---"
>> [1,2,3].join
=> "1---2---3"
>> $\ = '!!!'
=> "!!!"
>> print [1,2,3].join
1---2---3!!!=> nil

【讨论】:

  • 很好,但是puts可以做同样的事情吗?我问这个是因为 -- $\ = "\r\n" ; print arr -- 在一行上打印数组项,而我想在不同的行上自动打印每个条目,就像 puts 一样
  • 感谢您的宝贵时间和有用的回答 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2014-07-10
相关资源
最近更新 更多