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

182
18

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

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

спросил(а) 2021-01-19T17:40:18+03:00 9 месяцев назад
1
Решение
213

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


к


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

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


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

ответил(а) 2021-01-19T17:40:18+03:00 9 месяцев назад
65

Когда вы пишете 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"

ответил(а) 2021-01-19T17:40:18+03:00 9 месяцев назад
65

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


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


if input =! "N"

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


if input != "N"

ответил(а) 2021-01-19T17:40:18+03:00 9 месяцев назад
46

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


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


if input.downcase == "n"

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


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

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


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

ответил(а) 2021-01-19T17:40:18+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема