Предупреждение: строковый литерал в состоянии
Используя первый бит кода ниже, я получаю два предупреждающих сообщения:
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)
Второй способ позволяет значительно повысить гибкость при проверке, особенно если есть группы записей, которые вы ищете.
Надеюсь, что то, что я нашел, помогает другим.