Странная логика в сценарии Lua? - PullRequest
3 голосов
/ 15 февраля 2011

Я не могу понять, как Lua оценивает логические значения.

Вот тривиальный фрагмент, предназначенный для демонстрации проблемы:

function foo()
  return true
end

function gentest()
   return 41
end

function print_hello()
  print ('Hello')
end


idx = 0

while (idx < 10) do
 if foo() then
    if (not gentest() == 42) then
       print_hello()
    end
 end
 idx = idx +1
end

Когда этот скрипт будет запущен, я ожидаю, что на консоли будет напечатано «Hello» - однако ничего не печатается. Кто-нибудь может объяснить это?

Ответы [ 4 ]

10 голосов
/ 15 февраля 2011

Внутри цикла while вы должны использовать not вне скобок:

while (idx < 10) do
 if foo() then
    if not (gentest() == 42) then
       print_hello()
    end
 end
 idx = idx +1
end

(gentest() == 42) вернет false, затем not false вернет true.

(not gentest() == 42) совпадает с ( (not gentest()) == 42).Поскольку not gentest() возвращает not 41 == false, вы получите false == 42, и, наконец, это вернет false.

2 голосов
/ 15 февраля 2011

Попробуйте not (gentest() == 42). .

1 голос
/ 15 февраля 2011

Я не пробовал это, но я думаю, что not имеет более высокий приоритет, чем ==, что приводит к

if ((not 41) == 42) then

... и, очевидно, результат неоператор (либо верноили false) не равно 42.

0 голосов
/ 20 февраля 2011

В этом контексте вашего примера «не» будет рассматриваться не как логическое значение, а как оператор обращения. Логический пример, когда нет арифметического оператора - «если a» означает, что результат является истинным, когда проверка условия, статуса, события или переключателя «a» выполнена, «если нет» означает, что результат является истинным, когда условие, состояние, событие или Переключатель «а» не выполняется. Когда оператор условия имеет арифметический оператор и второе значение, тогда «not» немного отличается, и тест сравнивается с конкретным значением в качестве переменной или литерала, например «if a not = 42», поскольку это оператор условия, а не логический оператор и таблица истинности могут иметь разные записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...