Lua ""= = true равно "" ==false
у меня возникли проблемы с пониманием, как выражения ""==true
и ""==false
оценить по false
.
попытка следующего в интерпретаторе lua и ilua приводит к тому же результату:
> =""==true
false
> =""==false
false
или выполнив следующее:
print(""==true)
print(""==false)
print(""==nil)
выходы
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
false
false
false
>
еще пример:
> =""~=true
true
> =""==false
false
при запуске следующего кода:
if "" then -- if ""==true
print "was true"
end
if not "" then -- if ""==false
print "was not true"
end
выход (по-видимому непоследовательно)
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
was true
>
как и ожидалось в Lua FAQ, в котором говорится
C-подобные языки считают 0 эквивалентным false, но это не так для Луа. Только явное false или nil эквивалентны false. Когда в сомнении сделайте условие явным, например, если val == nil тогда ... конец если значение не является логическим.
как значение может быть не равна true
,false
или nill
?
4 ответов
все значения Lua при использовании в качестве логических вычисляются как true, кроме nil и false. Это не означает, что значения, оценивающие значение true, являются равной значение true. Если вы хотите преобразовать значение v
для Boolean используйте not not v
.
тип ""
является Строковой, а не логической, поэтому она не равна ни true
или false
.
чтобы быть более общим, когда Lua сравнивает два значения, он сначала проверяет их тип, если несоответствие типа, Lua думает, что два значения не равны сразу.
при использовании в качестве выражения управления единственными ложными значениями в Lua являются false
и nil
, все остальное оценивается как истинная ценность. Некоторые популярные путаницы включают число 0
пустая строка ""
строка "0"
, все они являются истинными значениями. Обратите внимание еще раз, что false
и nil
не равны, потому что они разных типов.
Итак, вернемся к примеру, в коде
if "" then -- if ""==true
print "was true"
end
Lua проверяет, если ""
is false
или nil
, так как это ни то, ни другое, то Lua рассматривает условие как истинное значение.
отказ от ответственности: у меня нет опыта работы с lua, это образованная догадка
Это, вероятно, потому, что "" является пустой строкой, поэтому Lua, вероятно, оценивает ее как строку с длиной нуля. Поскольку это допустимый объект, он не будет равен true, false или nil, он будет равен строке с нулевой длиной.
отказ от ответственности: единственное, что я знаю о Lua-это то, что я ничего не знаю о Lua.
похоже, что Lua обрабатывает сравнения равенства с помощью ==
и сравнения, сделанные в структурах управления (if
, while
, for
, etc.) иначе.
по словам руководство Lua 5.1 (раздел 2.4.4, структуры управления),
выражение состояния структуры управления может возвращать любое значение. Оба false и nil считаются ложными. Все значения, отличные от нуля и false считаются истинными (в частности, число 0 и пустая строка также true).
кажется, это согласуется с тем, что вы видите. То есть:
"" == false => false
"" == true => false
"" == nil => false
потому что оператор сравнения, похоже, проверяет тип и значение.
однако, если вы используете переменную в условном в структуре управления поведение немного отличается. То есть,
if "" then
print "Hello world!"
end
печати Hello world!
, потому что пустая строка отличается от обоих nil
и false
, и таким образом оценивает к истинному значению.