如何检查Lua中的值是不是为空?
Posted
技术标签:
【中文标题】如何检查Lua中的值是不是为空?【英文标题】:How to check if a value is empty in Lua?如何检查Lua中的值是否为空? 【发布时间】:2012-05-06 21:04:44 【问题描述】:在 Lua 中创建条件检查是否为空的正确方法是什么? if x == ""
和 f x ~= ""
似乎不起作用。
【问题讨论】:
空的意思,里面没有输入任何内容。 您不能将值“键入”到变量中。你能给出更准确的定义吗?因为包含""
字符串的变量不是“空的”。它有一个字符串。即""
。这是一个有效的字符串。因此并非一无所有。
好吧,那我空的意思是""
。
那你的代码在什么情况下不起作用? x = ""; if x == "" then print("empty"); else print("not empty"); end
是有效的 Lua 代码。它总是会打印“空”。当您没有 x = ""
部分时,您的问题是它停止工作吗?或者,换一种说法,仅仅因为 你 认为 ""
意味着空并不意味着 Lua 有。
为我们提供一些背景信息;您是否随时将值设置为""
?您是否正在从输入中读取值?这是库返回的值吗?它将向我们阐明您所说的“空”(一个非常主观的术语)是什么意思,从而使我们能够更有效地帮助您。
【参考方案1】:
Lua 是一种基于动态类型的语言。
任何变量都可以包含以下类型之一:nil、boolean、number、string、table 、函数、线程或用户数据。
表中没有值的任何变量(包括_G
,全局变量所在的表)在索引时都会给出nil
的值。当您将表变量设置为 nil
时,它实质上是“取消声明”它(完全从内存中删除该条目)。
当一个local
变量被声明时,如果它没有被立即赋值,它的值是nil
。与表变量不同,当您将local
变量设置为nil
时,它不会“取消声明”它(它的值只是nil
)。
在 Lua 中,一个空字符串 (""
) 仍然是一个“值”——它只是一个大小为零的字符串。
【讨论】:
我认为说“当你将一个变量设置为 nil 时,它本质上是“取消声明”它”有点不准确—nil
是一个真实的值,除了内部表格,例如,一个值为 nil
的局部变量仍然会在周围范围内隐藏变量...
你说得对;该声明针对的是表格对,而不是一般的所有变量。答案已被修改以反映这一点。
@snogglethorpe if nil then print( "nil is true") else print( "nil is not true!") end
--> nil 不正确!
@handle Heh...抱歉,“真实价值”是指“真实价值”,即我使用的是口语意义上的“真实”,而不是 Lua 意义上的... ^^;
(对不起,虽然这是一个非常古老的答案 - 我来到这里是因为它是受骗的根源。阅读答案并不能回答我的问题。也许答案在技术上是隐藏的在其中-对于我作为非程序员而言,它谈论了原因和限制并避免了有用的答案。被骗的人足够快地在关闭前将其发布到那里。只是想我也可以在这里投票)【参考方案2】:
我最近也遇到了这个问题。如果数据库值为“空白”(非空),LuaSQL 将返回空字符串。一个 hacky 方法,但这是我解决它的方法:
if (string.len(x) >= 1) then
...
end
【讨论】:
【参考方案3】:您的字符串中可能有空格、换行符或其他不可见字符。所以你认为它是“空的”,但事实并非如此。这通常发生在您从用户那里获取输入时,并且必须输入“enter”才能完成 - “enter”最终出现在字符串中。
您需要的是一个函数,它可以告诉您字符串是否为“空白” - 或者是空的,还是空格/制表符/换行符的列表。这是一种方法:
function isBlank(x)
return not not tostring(x):find("^%s*$")
end
用法:
if isBlank(x) then
-- ...
end
【讨论】:
那是相当低效的;not not string.find(x,"^%s*$")
嗯,你的版本是明确的(一旦你包括了省略的 tostring 调用)。我不太确定它是否明显更快。你为什么这么认为?
与string.find
相比,string.gsub
会为该操作分配大量内存(一个多次调整大小的新字符串,一个或两个用于替换的缓冲区)。
不是吗?我错过了什么还是这只是一个错字。删除“not not”,它仍然有效,但更容易阅读。
not not
是一个常见的成语,意思是 Lua 中的“转换为布尔值”。我不经常使用它,但由于 OP 对 Lua 来说似乎是新的,我想他不会被返回 true
或 false
的函数弄糊涂。此外,string.find
返回多个值,这可能会产生一些副作用,并且在您刚接触该语言时会让您措手不及。 not not
负责这一切。【参考方案4】:
我将假设 OP 的意思是“你如何判断一个变量何时未分配”。
例子:
local x
变量 x 为“空”,它被初始化为“nil”。 (不是文本“nil”,而是一个枚举值,表示该变量未赋值。在 Lua 中定义为 nil,在其他一些语言中定义为 NULL。)
现在给 x 赋值。 示例:
x=""
现在 x 不为零。 另一个例子:
x=0
x 不为零。
尝试运行这段代码,它应该会让你清楚情况。
local x
if x==nil then print("x is nil") end
x=0
if x==nil then print( "This line won't be written") end
x=""
if x==nil then print( "and this line won't be written") end
第一个 if 语句将评估为 true 并调用 print 语句。第 2 和第 3 个 if 语句为 false,打印语句不会被执行。
总之,使用“==nil”来检查变量是否为“空”(更恰当地说是“nil”)。
【讨论】:
以上是关于如何检查Lua中的值是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章