Предупреждение: строковый литерал в состоянии

Используя первый бит кода ниже, я получаю два предупреждающих сообщения: warning: string literal in condition x2

if input == "N" || "n"
  #do this
else input == "L" || "l"
  #do this

в отличие от использования этого, что не дает никаких предупреждений

if input == "N" || input == "n"
  #do this
else input == "L" || input == "l"
  #do this

Мне интересно, почему первый бит кода приводит к предупреждению и недостатку его использования.

Ответы

Ответ 1

изменить input == "N" || "n"

к

input == "N" || input== "n"

Вы также должны использовать else if вместо else

Предупреждение говорит, что вместо логического или тестового, у вас есть строковый литерал, 'n', который всегда оценивается как true.

Ответ 2

Когда вы пишете input == "N" || "n" (внутренне Ruby видит его (input == "N") || "n"), это означает, что "n" строковый объект всегда является значением истинности. Поскольку в Ruby каждый объект true, кроме nil и false. Ruby-интерпретатор предупреждается о том, что нет смысла указывать, что истинное значение является условной проверкой. Условная инструкция проверки всегда ожидает выражения выражения равенства/не-равенства. Теперь вы можете продолжить этот путь или заново подумать. if input == "N" || input == "n" не бросает никакого предупреждения, так как оно подчиняется норме условного теста.

else input == "L" || "l" неверно, поскольку оператор else не ожидает выражения условного теста. Измените его на elseif input == "L" || "l"

Ответ 3

У меня такая же ошибка, как и у вас, но с другой проблемой, найденной через Google, а также отправьте мое решение для следующего Googler.

У меня была опечатка в моем коде, которая также дает такое же предупреждение:

if input =! "N"

конечно, правильный путь:

if input != "N"

Ответ 4

Я также искал ответ на этот вопрос, и благодаря другу нашел несколько других решений.

1) Измените регистр для ввода, поэтому вам нужно сделать только один тест:

if input.downcase == "n"

2) Используйте более сложную проверку входных данных:

if %w{n N}.include?(input)     or
if ['n', 'N'].include?(input)

Второй способ позволяет значительно повысить гибкость при проверке, особенно если есть группы записей, которые вы ищете.

Надеюсь, что то, что я нашел, помогает другим.