Пожалуйста, объясните поведение ruby ​​ARGF - PullRequest
1 голос
/ 28 января 2011
   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 или моя ошибка?
  3. Как ее исправить?

Требуется помощь.Я продолжаю смотреть на это и спрашиваю себя, что я на самом деле сделал глупость?Большое спасибо заранее.

Алоха, Уилл

Ответы [ 2 ]

3 голосов
/ 28 января 2011

each_line не удаляет символы новой строки в конце строк, поэтому строки, полученные с помощью each_line, будут содержать символы новой строки.print, с другой стороны, не добавляет новые строки в конец строк (если вы хотите, используйте puts).Таким образом, print "hello\nworld:, за которым следует print "lala", напечатает

hello
world:lala

, что объясняет, почему ваш вывод выглядит так, как он.

Чтобы получить нужный вывод, используйте line.chompline, который удалит символ новой строки в конце line и, таким образом, не позволит вашим строкам содержать разрыв строки до x:.

1 голос
/ 28 января 2011

Небольшое сожаление здесь. Я fergot о конце строки и проблемах CR / LF в Windows. Решение кажется следующим:

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

Который печатает строку:

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

Оставшаяся ловушка для молодых игроков - поставить собственный символ новой строки (\ n) после метода chomp! (). Одна ошибка, которую я сделал с этим, заключалась в том, что я думал «trim ()», а не «chomp ()» - насколько я сумасшедший

Приветствия

Будет

...