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, и таким образом оценивает к истинному значению.