Возможно, вы уже понимаете, что происходит, но я уже написал этот пост.У Lua нет оператора !
;Я думаю, вы имели в виду not
.(Я не удивлюсь, если кто-то сделает исправленную версию Lua с !
вместо not
.)
a(nil, 1)
возвращает not nil and d(1) or print("b", true)
.Теперь not nil
оценивается в true
, а d(1)
оценивается в nil
, поэтому мы имеем true and nil or print("b", true)
, что, в свою очередь, оценивается в nil or print("b", true)
, и, следовательно, print("b", true)
оценивается.
Что касается того, почему d(1)
оценивается как ноль: возвращается not 1 and print("c", false) or print("c", true)
.Это эквивалентно not 1 and nil or nil
, поскольку print
всегда ничего не возвращает при его вызове, и операторы and
и or
ничего не обрабатывают как nil
.not x and nil or nil
всегда оценивает nil
, является ли x
верным или ложным, поэтому d
всегда возвращает ноль.(Единственное отличие состоит в том, что если d
получает ложное значение, оба вызова print
оцениваются.)
Вы можете проверить, что print
ничего не возвращает, вызвав type(print('a'))
: выдает ошибку "неверный аргумент № 1 для типа (ожидаемое значение), тогда как type(nil)
возвращает "nil"
.