请解释ruby ARGF的行为

时间:2011-01-28 15:45:27

标签: ruby command-line rake

   ARGF.each_with_index do |line, idx|
      print( "[#{idx}] #{line} x: " );
      indent = Indent
         # do stuff
      indent = ""
   end #ARGF e

STDIN的每一行显示为,

   x: [1] W:\sandbox\tmp\for_each\for_each.rake

如果你问我,那不好 / 奇数

另一个无法解释的结果,就是......

 print( "ab: [#{idx}] #{line} x: " );

显示器:

x: ab: [1] W:\sandbox\tmp\for_each\for_each.rake

我在这里得到奇怪的感觉。三个问题,是这个问题:

  1. 如何在每个' '开头的“x:”字符串结束?字符串??!
  2. Ruby v1.8.7 bug还是我的bug?
  3. 如何解决?
  4. 需要帮助。我一直在看着这个,想知道我做了什么真的很蠢?非常感谢提前。

    aloha,Will

2 个答案:

答案 0 :(得分:3)

each_line不会删除行尾的换行符,因此each_line生成的字符串将包含换行符。另一方面,print不会在字符串末尾添加换行符(如果需要,请使用puts)。因此print "hello\nworld:后跟print "lala",将打印

hello
world:lala

解释了为什么你的输出看起来像它的方式。

要获得所需的输出,请使用line.chomp代替line,这将删除line末尾的换行符,从而防止字符串在x:之前包含换行符{1}}。

答案 1 :(得分:1)

这里有点遗憾。我 fergot 关于Windows的行尾和CR / LF问题。解决方案似乎是:

line.chomp!
print( "ab: [#{idx}] #{line}:x\n" );

打印行:

ab: [1] W:\sandbox\tmp\for_each\for_each.rake x:

年轻球员的剩余陷阱是在chomp!()方法之后放置自己的换行符(\ n)。我对此犯的一个错误是'trim()'不'chomp()' - 我有多疯狂。

干杯,

  

威尔