. Каждый цикл не выполняется - PullRequest
0 голосов
/ 20 марта 2019

У меня есть этот фрагмент кода:

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 ]

2 голосов
/ 20 марта 2019

Создает файл, но больше ничего не делает. Почему это так?

Поскольку вы звоните 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
0 голосов
/ 20 марта 2019

Пара проблем здесь.

Во-первых, вы используете переменную имени файла File.open(input... также как переменную для того, что вводит пользователь (input = gets.chomp).Не делайте этого.

Во-вторых, когда вы открываете существующий файл для записи с помощью w+, вы усекаете его до нулевой длины.Ваш цикл на самом деле является блоком в этой точке.Если бы вы читали, это была бы другая история.

Попробуйте открыть файл и присвоить его переменной:

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

Затем запустите цикл (begin...end while), который получает вводи записывает его в f следующим образом:

userstuff = gets.chomp
f.write(userstuff)

Не забудьте закрыть файл, когда закончите запись в него:

f.close
0 голосов
/ 20 марта 2019

Мне кажется, что вы пытаетесь выполнить запись в файл.Вот слегка измененная версия, которая повторяет то, что вы написали, и добавляет ее в виде новой строки в файле:

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
0 голосов
/ 20 марта 2019

Поскольку вы создаете новый файл, и он пуст, поэтому ни строк, ни блоков не выполняется. Если вы хотите войти в цикл, этот файл должен содержать несколько строк, и вам нужно открыть его в режиме добавления

File.open(input, "a+")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...