.each循环未执行

时间:2019-03-19 21:28:12

标签: ruby

我有以下代码段:

File.open(input, "w+").each do |line|
   puts "Enter line content, or \"-EOF-\" to stop inputting."
   input = gets.chomp
   if input == "-EOF-"
        break
   else
       line.puts input
   end
end

它创建文件,但是不执行其他指定的操作。为什么会这样?

4 个答案:

答案 0 :(得分:2)

  

它创建文件,但是不执行其他指定的操作。为什么会这样?

因为调用File.open(...).each而不是File.open(...) –您想打开文件而不是遍历文件的内容。

此外,您不必发明自己的EOF处理方式。按下 Ctrl - D 将生成EOF指示符,该指示符进而导致gets返回nil

这使您可以进行一个简单的循环:

File.open(input, 'w+') do |file|
  puts 'Enter lines, or hit "Ctrl-D" to stop inputting.'
  while line = gets
    file.puts line
  end
end

答案 1 :(得分:0)

因为您正在创建一个新文件,并且该文件为空,所以没有行,也没有执行块。如果要进入循环,该文件应包含一些行,并且需要以附加模式打开它

Container

答案 2 :(得分:0)

这里有两个问题。

一个,您还使用文件名变量File.open(input...作为用户输入的变量(input = gets.chomp)。不要那样做。

第二,当您打开现有文件以使用w+进行写入时,会将其截断为零长度。在这一点上,您的循环实际上是一个障碍。如果您正在阅读,那将是另一回事。

尝试打开文件并将其分配给变量:

f = File.new(input,  "w+")

然后运行一个循环(begin...end while),该循环获取输入并将其写入f,如下所示:

userstuff = gets.chomp
f.write(userstuff)

完成写入后,请不要忘记关闭文件:

f.close

答案 3 :(得分:0)

在我看来,您想要完成的工作是写入文件。这是一个经过修改的版本,它回显了您所编写的内容,并将其作为新行添加到文件中:

input = 'test.txt'
File.open(input, "w+") do |file| # File open returns the file, not it's lines
  loop do
    puts "Enter line content, or \"-EOF-\" to stop inputting."
    input = gets # no chomp here, because we probably want that in the file
    if input.chomp == "-EOF-" # chomp here to compare with `"-EOF-"` instead of "-EOF-\n"
      break
    else
      file << input # this writes your input line to the file
      puts input
    end
  end
end