проблема с rspec предположительно связана с вызовом gets.chomp

У меня возникли проблемы или я запутался с ошибкой rspec при запуске:

rspec -fd game_spec

Respec сообщение об ошибке

(это только начало длинного сообщения об ошибке)

Когда я запускаю его без -fd, он работает... но выглядит глупо... что-то не так. Я начинаю получать сообщения об ошибках, когда использую gets.chomp, но я просмотрел аналогичные примеры, в которых он используется. Нужно ли устанавливать 'the_word' при инициализации? Получает ли gets.chomp или может? Я ценю любую помощь. Ниже приведен файл игры и его rspec на данный момент. Я вообще не хочу сильно меняться. Я просто хочу получить то, что у меня есть до сих пор, и продолжать двигаться вперед. Спасибо!

проблемный пользовательский интерфейс  файл rspec


person Rob Matthews    schedule 12.11.2016    source источник
comment
кстати, предпочтительнее добавить в вопрос блок кода, чем использовать скриншот   -  person max pleaner    schedule 13.11.2016


Ответы (2)


Причина в том, что gets читает из ARGV (переменные-аргументы), например флаг -fd, который вы указываете для rpsec.

Вы можете легко воссоздать эту ситуацию:

> ruby -e "puts gets.chomp" ASD
-e:1:in `gets': No such file or directory @ rb_sysopen - ASD (Errno::ENOENT)
    from -e:1:in `gets'
    from -e:1:in `<main>'

Вы можете предотвратить это, очистив ARGV перед вызовом gets..

> ruby -e "ARGV.clear; puts gets.chomp" ASD
asd # <-- I then type this
asd # <-- and this is printed

Вы не можете просто сказать ARGV = [], потому что это константа, но вызов clear допустим, потому что это не переопределение переменной.

Короче говоря, просто поместите это где-нибудь перед gets.chomp:

ARGV.clear

Вот еще один вопрос по теме: Ruby readline не работает, если процесс запущен с аргументами< /а>

person max pleaner    schedule 12.11.2016
comment
огромное спасибо. так где именно вы помещаете его перед ним? как это? 'code' ставит Пожалуйста, СТРАТЕГИЧЕСКИ дайте мне слово, первый игрок. game.the_word = ARGV.clear gets.chomp.split('')'code' - person Rob Matthews; 13.11.2016
comment
поместите его в отдельную строку перед присваиванием game.the_word и вызовом gets.chomp. Если вы не используете ARGV в своем коде (а вы, кажется, не используете), вы можете поместить его в начало файла. - person max pleaner; 13.11.2016
comment
понятно! Потрясающие. высоко ценится ARGV.clear; получает.chomp.split('') - person Rob Matthews; 13.11.2016

Я знаю, что на этот вопрос был дан ответ. Я также новичок в Ruby, но учебник используется таким образом. Он использовал $stdin.gets.chomp

Таким образом, ваш код будет game.the_word = $stdin.gets.chomp

Согласно моим исследованиям, gets.chomp сначала проверит содержимое в ARGV и, если ничего не найдет, использует стандартный ввод. Если вы сделаете это таким образом, пользовательский ввод будет прочитан напрямую. :)

person Elizabeth Oyekunle    schedule 04.12.2019