Lua - 执行return和or时出错

问题描述 投票:1回答:1

我基本上做了一些测试,以便更好地了解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 trueb true

如果技术上不可能的话,任何人都可以告诉我为什么它会返回两个值?

debugging error-handling lua
1个回答
2
投票

也许你已经明白发生了什么,但我已经写过这篇文章了。 Lua没有!运营商;我想你的意思是not。 (如果有人用!代替not修改了Lua版本,我不会感到惊讶。)

a(nil, 1)返回not nil and d(1) or print("b", true)。现在,not nil评估trued(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在被调用时总是不返回任何内容,并且运算符niland都没有将任何内容视为ornot x and nil or nil总是评估nil是否x是真或假,所以d总是返回零。 (唯一的区别是,如果d收到假值,则会评估两个print调用。)

你可以通过调用print验证type(print('a'))没有返回任何内容:它会将错误“bad argument#1 to'type'(value expected)”,而type(nil)返回"nil"

© www.soinside.com 2019 - 2024. All rights reserved.