如何检查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 是一种基于动态类型的语言。 任何变量都可以包含以下类型之一:nilbooleannumberstringtable 函数线程用户数据。 表中没有值的任何变量(包括_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 来说似乎是新的,我想他不会被返回 truefalse 的函数弄糊涂。此外,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中的值是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查Excel中的日期单元格是不是为空?

检查对象中的值是不是为空或空javascript

如何检查 Lua 中的两个值是不是原始相等?

检查返回的值是不是为空[重复]

如何检查表是不是包含Lua中的元素?

如何检查 jQuery datepicker 是不是为空?