Что означает "строковый литерал в условии"?

Всякий раз, когда я пытаюсь запустить программу, появляется сообщение об ошибке "строковый литерал в условии (в строке 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" - это строковый литерал, поэтому рутинный интерпретатор жалуется.

Другие вопросы по тегам