#ruby #if-statement
#ruby #if-statement
Вопрос:
puts "Commands: /startEngine, /upgrade"
command = gets
if command.include? "/"
command.slice! "/"
isStartEngine = command <=> "startEngine"
if isStartEngine == 0
puts "Starting engine"
sleep(1)
print "3"
sleep(1)
print "2"
sleep(1)
print "1"
sleep(1)
print "GO!"
else
puts "Unknown"
end
end
Это мой код, но он всегда возвращает else при if isStartEngine . Использование case не работает, и я не знаю, что будет, и я новичок в ruby. Извините, если это вопрос новичка. Спасибо!
Комментарии:
1. (1)
gets
включает завершающую новую строку, поэтомуcommand
никогда не будет'startEngine'
, удалите завершающую новую строку перед сравнением. (2) Оператор космического корабля (<=>
) обычно не используется для сравнений на равенство,if command == 'startEngine'
был бы более идиоматичным.2. @muistoosh, «обычно» предполагает, что есть исключения. Хотите дать один? Будет ли «когда-либо» лучше?
3. @CarySwoveland То, что я не могу придумать ни одного, не означает, что их нет. Мой опыт написания — академическая математика / естественные науки, поэтому я опасаюсь абсолютов.
Ответ №1:
Когда вы делаете
command = gets
вы получаете обратно строку с добавленным символом новой строки «n»
Если вы это сделаете
command.chomp!
это приведет к удалению любых нежелательных пробелов или символов новой строки. Это должно сработать:
puts "Commands: /startEngine, /upgrade"
command = gets
command.chomp!
if command.include? "/"
command.slice! "/"
isStartEngine = command <=> "startEngine"
if isStartEngine == 0
puts "Starting engine"
sleep(1)
print "3"
sleep(1)
print "2"
sleep(1)
print "1"
sleep(1)
print "GO!"
else
puts "Unknown"
end
end
Комментарии:
1. Подумайте о простом написании
if gets.chomp == "/startEngine"; puts "Starting engine"; sleep(1); ...
. Вы могли бы написатьif gets == "/startEnginen"; ...
, но это вызывает проблему на компьютерах с Windows, потомуgets
что вернет"/startEnginern"
. Нужно было бы написатьif gets.match?(/A/startEnginer?nz/) ...
.2. @CarySwoveland Или
case gets.chomp when '/startEngine' ...
поскольку уже существует более одной команды.