如何检查Lua中的值是否为空?

如何检查Lua中的值是否为空?,lua,conditional,Lua,Conditional,在Lua中,什么是对某物进行条件检查的正确方法如果x==”和fx~=”似乎不起作用。Lua是一种动态基于类型的语言 任何变量都可以包含以下类型之一:nil、boolean、number、string、table、function、thread或userdata。 表(包括全局变量所在的表)中没有值的任何变量在索引时给出的值为nil。当您将表变量设置为nil时,它实际上是“取消声明”它(从内存中完全删除该项)。 声明局部变量时,如果未立即赋值,则会给它一个值nil。与表变量不同,当您将local变

在Lua中,什么是对某物进行条件检查的正确方法
如果x==”
fx~=”
似乎不起作用。

Lua是一种动态基于类型的语言
任何变量都可以包含以下类型之一:nil、boolean、number、string、table、function、thread或userdata。
表(包括全局变量所在的表)中没有值的任何变量在索引时给出的值为
nil
。当您将表变量设置为
nil
时,它实际上是“取消声明”它(从内存中完全删除该项)。
声明
局部
变量时,如果未立即赋值,则会给它一个值
nil
。与表变量不同,当您将
local
变量设置为
nil
时,它不会“取消声明”它(它的值只是
nil


在Lua中,空字符串(
)仍然是一个“值”-它只是一个大小为零的字符串。

字符串中可能有空格、换行符或其他不可见的字符。所以你认为它是“空的”,但它不是。这通常发生在从用户获取输入时,并且必须键入“enter”以完成-字符串中的“enter”结束

您需要的是一个函数,它告诉您字符串是“空的”——或者是空的,或者是空格/制表符/换行符列表。这里有一种方法:

function isBlank(x)
  return not not tostring(x):find("^%s*$")
end
用法:

if isBlank(x) then
  -- ...
end

我最近也遇到了这个问题。如果数据库值为“空白”(非null),LuaSQL将返回空字符串。这是一种令人讨厌的方法,但我是这样解决的:

if (string.len(x) >= 1) then
    ...
end

空的意思是,其中没有键入任何内容。不能将值“键入”到变量中。你能给出一个更精确的定义吗?因为包含
字符串的变量不是“空的”。它有一根绳子。即
。这是一个有效的字符串。所以不是什么都没有。好吧,那么空的意思是
。那么你的代码在什么方面不起作用呢<代码>x=“”;如果x==”,则打印(“空”);否则打印(“非空”);结束是有效的Lua代码。而且它总是打印“空”。当您没有
x=”“
部件时,它是否会停止工作?或者,换一种说法,仅仅因为你认为
意味着空并不意味着Lua意味着空;您是否随时将该值设置为
?您正在从输入读取值吗?这是库返回的值吗?它将向我们澄清你所说的“空”(一个非常主观的术语)的含义,从而使我们能够更有效地帮助你<代码>非字符串。查找(x,“^%s*$”好吧,您的版本是确定的(一旦您包含ommited tostring调用)。我不太确定它是否明显更快。您认为为什么?
string.gsub
会为该操作分配大量内存(一个新字符串大小调整了好几次,一个或两个缓冲区用于替换)而不是
string.find
。不是吗?是我遗漏了什么,还是这只是一个打字错误。删除“not not”,它仍然有效,但更易于阅读。
not not
是一个常见的习惯用法,在Lua中表示“转换为布尔值”。我不经常使用它,但由于OP对Lua来说似乎是新的,我想他不会对返回
true
false
的函数感到困惑。此外,
string.find
返回多个值,这可能会产生一些副作用,并且在您刚接触该语言时会让您措手不及
not not
解决了所有这些问题。我认为说“当您将一个变量设置为nil时,它实际上是“未声明”它”有点不准确&mdash
nil
是除表内之外的真值,因此,例如,一个值为
nil
的局部变量仍然会在周围范围内隐藏变量…您完全正确;该声明针对的是表对,而不是所有变量。答案已被修改以反映这一点。@snoglethorpe
如果为nil,则打印(“nil为真”),否则打印(“nil为非真!”)结束
-->nil为非真@处理,呵呵。。。对不起,我所说的“真值”是指“真值”,也就是说,我用的是口语意义上的“真”,而不是Lua意义上的…^^;(对不起,虽然这是一个非常古老的答案——我来这里是因为它是一个傻瓜的根源。阅读答案对我来说并不能回答这个问题。也许答案在技术上是隐藏在里面的——对于我这个非程序员来说,它谈论原因和限制,避免一个有用的答案。傻瓜中的某个人很快就在closur之前把它贴到了那里e、 我想我也可以在这里投票)