Lua - Ошибка в выполнении возврата и или - PullRequest
0 голосов
/ 10 ноября 2018

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

Функция:

local function d(c)
    return (!c and print("c", false) or print("c", true))
end

local function a(b, c)
    return (!b and d(c) or print("b", true))
end

Когда я запускаю a(1, nil) или a(1, 1), он выдает b true, но если я запускаю a(nil, 1), тогда он выдает c true и b true

Если бы кто-нибудь мог просветить меня, почему он возвращает два значения, когда это технически невозможно?

1 Ответ

0 голосов
/ 10 ноября 2018

Возможно, вы уже понимаете, что происходит, но я уже написал этот пост.У 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".

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