Операторы Ruby if всегда являются else

#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' ... поскольку уже существует более одной команды.