如何在 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。

相關文章
相關標籤/搜索