Читать и писать Ruby - PullRequest
0 голосов
/ 25 мая 2019

Не получается, что мои данные читаются как целое число и выводятся на печать, вместо этого получается 2-й вариант, который является ошибкой: первая строка файла не является числом.

    def write(aFile, number)
  aFile.puts(number)
  index = 0
  while (index < number)
   aFile.puts(index)
   index += 1
  end
end

def read(aFile)
  count = aFile.gets
  if (is_numeric?(count))
    count = count.to_i
  else
    count = 0
    puts "Error: first line of file is not a number"
  end

  index = 0
  while (count < index)
    line = aFile.gets
    puts "Line read: " + line
    index += 1
  end
end

def main
  aFile = File.new("mydata.txt", "w") # open for writing
  if aFile  # if nil this test will be false
    write(aFile, 10)
    aFile.close
    aFile = File.new("mydata.txt", "r") 
    read(aFile)
    aFile.close
  else
    puts "Unable to open file to write or read!"
  end
end

def is_numeric?(obj)
  if /[^0-9]/.match(obj) == nil
    true
  end
  false
end

main

Любая помощь в том, как это исправить, была бы отличной

1 Ответ

0 голосов
/ 25 мая 2019

Ваша проблема - отсутствие return

def is_numeric?(obj)
  if /[^0-9]/.match(obj) == nil
    true
  end
  false
end

Эта функция ВСЕГДА возвращает false.Нет случая, чтобы он когда-либо возвращал истину.Ruby-функции всегда возвращаются с явным return(), и если ни одна из них не вызывается, возвращается последняя строка.Это значит, что true у вас там ничего не делает.Он просто отбрасывается и возвращается false.

Упрощенная форма этой существующей функции просто:

def is_numeric?(obj)
  false
end

Чтобы исправить эту проблему, вам нужно return, когда она истинна:

def is_numeric?(obj)
  if /[^0-9]/.match(obj) == nil
    return(true)
  end
  false
end

Вы также можете упростить это до:

def is_numeric?(obj)
  /[^0-9]/.match(obj).nil?
end

Кроме того, если вы используете Ruby 2.4+, более эффективный способ сделать это - использовать совпадение? метод и отрицание.match устанавливает некоторые удобные MatchData (и обратные ссылки), но, поскольку вам, если вам это не нужно, вы можете сэкономить накладные расходы, используя match?, который просто возвращает логическое значение.

def is_numeric?(obj)
  !/[^0-9]/.match?(obj)
end

Другая проблема - ваша логика count < index.

  while (count < index)
    line = aFile.gets
    puts "Line read: " + line
    index += 1
  end

Поскольку index равно 0, единственное время count будет меньше index, если число меньше 0. Возможно, вы имели в виду while (count > index)?

Примечания:

https://www.ruby -lang.org / ru / news / 2016/12/25 / ruby-2-4-0-release /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...