如何在 AHK 中判断空字符串

上一篇文章咱们了解到了如何在 AHK 中比较字符串,但有一个细节我故意忽略了,也就是如何判断一个字符串是否为空(或者说一个变量是否为空,AHK 中空变量、空字符串和未定义变量是一回事)。按理说这应该是一个很简单的问题,一笔带过便可,无需单独写一篇文章来介绍。对其余语言也许是这样,但 AHK 在这个问题上存在一些麻烦,值得一提。编程

常规的字符串判空

a := ""

; 方法一:
; = 也可替换成 ==,由于空字符串无大小写问题,不赘述
if (a = "")
{
    ; 条件成立
}

; 方法二:
if (a)
{
    ; 作正常的事情
}
else
{
    ; 条件成立
}

方法一就是其余编程语言中的方法,无需过多解释。方法二是一种简化的写法,在多数状况看起来也是正常的,但存在一些特殊状况。微信

特殊状况一:数字 0

在一些特殊状况,方法二存在问题。编程语言

若是变量为字符串 "0",或者整数 0,或者浮点数 0.0:函数

a := "0"
; 或者
; a := 0
; 或者
; a := 0.0

; 方法一:
; = 也可替换成 ==,由于空字符串无大小写问题,不赘述
if (a = "")
{
    ; 条件不成立
}

; 方法二:
if (a)
{
    ; 作正常的事情
}
else
{
    ; 条件成立,判断错误
}

恐怕没有人认为一个长度为一的字符串 "0" 是空字符串。但第二种方法给出了错误的结果。缘由是 0 被认为是布尔值 false,并且 AHK 中的字符串和数字并无那么确切的区别,不少状况能够自动相互转换,直接用 if 判断天然不经过,看来这个简化仍是要不得。code

特殊状况二:Object()

还有一种特殊状况是空对象 Object()。一般来讲,咱们不该该认为 Object() 是空变量,但某些库的做者可能不严谨,在本应返回空变量的地方返回了 Object()(我印象中遇到过这样的问题,但今天没有复现出来,若是之后发现了再举例)。若是用方法一判断,就可能出问题。对象

a := Object()

; 方法一
; = 也可替换成 ==,由于空字符串无大小写问题,不赘述
if (a = "")
{
    ; 条件不成立
}

; 方法三
if (StrLen(a) = 0)
{
    ; 条件成立
}

方法一认为 Object() 不是空变量,那么继续将 a 传递下去处理,就可能出问题。方法三是调用 StrLen() 函数来检查字符串的长度,它成功发现了这不是一个有效的字符串。继承

但用 StrLen() 函数判断也存在问题,一个很严重的问题是方法三的耗时要比方法一长一倍以上。由于调用函数须要一些额外开销,在几乎全部语言都是如此。若是这个判断在一个很大的循环里边,额外的开销是很大的。ip

另外 Object() 是否算空变量或者空字符串,这实际上是有争议的。我我的是认为不该该算,但在某些语言中,全部变量类型都是从 Object 类型继承来的,那么就应该算。在用一些库时,仍是须要验证一下是否存在 Object() 的问题,以避免之后出了问题没有头绪。字符串

总结

一般状况,用方法一判断空字符串或者空变量就足够了,简单易懂。在某些特殊状况,可能须要用方法三来判断,但要付出额外的开销。另外本文可能还有一些细节没有提到,我想起来后再补充。变量

付费解决 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等领域相关问题,灵活订价,欢迎咨询,微信 ly50247。

相关文章
相关标签/搜索