Что означает "строковый литерал в условии"?
Всякий раз, когда я пытаюсь запустить программу, появляется сообщение об ошибке "строковый литерал в условии (в строке 10)". Что я делаю неправильно?
puts "Welcome to the best calculator there is. Would you like to (a) calculate the area of a geometric shape or (b) calculate the equation of a parabola? Please enter an 'a' or a 'b' to get started."
response = gets.chomp
if response == "a" or "A"
puts "ok."
elsif response == "b" or "B"
puts "awesome."
else
puts "I'm sorry. I did not get that. Please try again."
end
4 ответа
Вы должны указать полное условие по обе стороны от or
,
if response == "a" or response == "A"
Две стороны or
не связаны; Руби не делает предположений о том, что справа, основываясь на том, что слева. Если правая сторона голая строка "A"
ну ничего кроме false
или же nil
считается "истинным", поэтому все выражение все время оценивается как "истинное". Но Ruby замечает, что это строка, а не логическое значение, подозревает, что вы не указали, что вы хотели, и поэтому выдает предупреждение в вопросе.
Вы также можете использовать case
выражение для упрощения выполнения нескольких тестов для одного значения; если вы предоставите список нескольких возможностей в одном when
они эффективно or
вместе
case response
when "a","A"
puts "ok"
when "b","B"
puts "awesome."
else
puts "I'm sorry. I did not get that. Please try again."
end
Для конкретной ситуации игнорирования буквенного регистра вы также можете просто конвертировать в верхний или нижний регистр перед тестированием:
case response.upcase
when "A"
puts "ok"
when "B"
puts "awesome."
else
puts "I'm sorry, I did not get that. Please try again."
end
Это не ошибка, это предупреждение.
У вас есть условие
response == "a" or "A"
Что ж, response == "a"
либо true
или же false
, Если это true
состояние сводится к
true or "A"
который
true
Если это false
состояние сводится к
false or "A"
который
"A"
что правда, так как все, кроме false
а также nil
это правда
Таким образом, независимо от содержания response
условие всегда будет верным.
И это то, о чем вас предупреждает предупреждение: строковые литералы всегда правдивы, просто не имеет смысла использовать их в условии.
Это не неправильно синтаксически; это неправильно в том смысле, что это бесполезно. Выражение response == "a" or "A"
интерпретируется как (response == "a") or "A"
что всегда правдиво из-за "A"
так что бесполезно ставить это в состояние.
if response == "a" or "A"
эквивалентно if (response == "a") or "A"
, А "A" - это строковый литерал, поэтому рутинный интерпретатор жалуется.