跳轉到內容

Scribunto:入門/字串

來自華夏公益教科書,開放的書籍,開放的世界

在 Scribunto 中,您大部分時間可能會處理文字。您可能還記得,程式設計師將一段文字稱為字串。幸運的是,Lua 為程式設計師提供了很大的靈活性來輸入和操作字串。在本節中,我們將介紹一些字串基礎知識。

字串輸入

[編輯 | 編輯原始碼]

在我們第一個除錯控制檯中的程式中,我們用雙引號包圍了要顯示的文字。

程式碼:

= "Hello, world!"

輸出:

Hello, world!

雙引號告訴 Lua 我們輸入的是一個字串,而不是其他 Lua 命令。但是,不僅僅是雙引號可以建立字串。您可以使用單引號來做完全相同的事情。

程式碼:

= 'Hello, world!'

輸出:

Hello, world!

如果您的文字包含雙引號或單引號,您可以使用另一種型別的引號來避免它。

程式碼:

= 'Susan said, "Hello!"'

輸出:

Susan said, "Hello!"

程式碼:

= "This is Jim's book."

輸出:

This is Jim's book.

如果嘗試使用相同型別的引號,您將收到錯誤,因為 Lua 不知道哪些引號是文字的一部分,哪些引號應該用作字串的結束。

程式碼:

= "Susan said, "Hello!""

輸出:

Lua error in console input at line 7: ')' expected near 'Hello'.

轉義序列

[編輯 | 編輯原始碼]

能夠使用單引號或雙引號來建立字串非常方便。但是,如果我們要輸入的文字包含單引號和雙引號,會發生什麼?處理這種情況的一種方法是使用轉義序列。在帶單引號或雙引號的字串中,我們可以使用反斜槓 \ 來告訴 Lua 引號應該被解釋為文字中的引號,而不是表示字串結尾的引號。

程式碼:

= 'Susan said, "Jim said, \'Hello!\'"'

輸出:

Susan said, "Jim said, 'Hello!'"

如果您將反斜槓與一些字母一起使用,那麼它們可能具有特殊含義。例如,\n 插入一個換行符。

程式碼:

= 'Hello, world!\nHello, Jim!\nHello, Susan!'

輸出:

Hello, world!
Hello, Jim!
Hello, Susan!

您還可以透過在行末新增反斜槓來將文字換行符插入字串。當您在除錯控制檯中嘗試此操作時,您需要在每行末按 Shift + Enter。如果您只按 Enter,您的程式碼將被執行,Lua 會丟擲錯誤,因為它找不到字串的結尾。

程式碼:

= 'Hello, world!\
Hello, Jim!\
Hello, Susan!'

輸出:

Hello, world!
Hello, Jim!
Hello, Susan!

Lua 還提供其他轉義序列,例如 \t 代表水平製表符,\v 代表垂直製表符。也可以透過使用反斜槓後跟 0 到 255 之間的數字來指定字元;例如,\65 是字母 "A"。但是,您不太可能需要使用這些。

要將反斜槓字元插入文字中,而不賦予其任何特殊含義,您需要用另一個反斜槓對其進行轉義。

程式碼:

= 'C:\\Windows'

輸出:

C:\Windows

長括號

[編輯 | 編輯原始碼]

我們已經看到轉義序列允許我們建立包含單引號和雙引號的字串。但實際上,我們還有另一種方法可以做到這一點:使用長括號。要建立一個長括號字串,您用雙方括號包圍您的文字。

程式碼:

= [[Susan said, "Jim said, 'Hello!'"]]

輸出:

Susan said, "Jim said, 'Hello!'"

長括號字串可以跨多行擴充套件,無需任何特殊格式。出於這個原因,它們也被稱為多行字串。再次提醒,在除錯控制檯中,當您想開始新行時,請記住輸入 Shift + Enter,而不僅僅是 Enter。

程式碼:

= [[Hello, world!
Hello, Jim!
Hello, Susan!]]

輸出:

Hello, world!
Hello, Jim!
Hello, Susan!

為了幫助模組程式碼的格式化,如果長括號字串以新行開頭,那麼該新行不會出現在輸出中。(但這隻適用於字串的開頭,而不是結尾;如果您在字串末尾新增一個額外的換行符,它將被解釋為字串的一部分。)

程式碼:

= [[
Hello, world!
Hello, Jim!
Hello, Susan!]]

輸出:

Hello, world!
Hello, Jim!
Hello, Susan!

不能在長括號字串中使用轉義序列。所有這樣的序列將被逐字解釋。

程式碼:

= [[Hello, world!\nHello, Jim!\nHello, Susan!]]

輸出:

Hello, world!\nHello, Jim!\nHello, Susan!

您可能已經注意到,這種雙方括號語法與在 MediaWiki 中建立維基連結的語法相同。由於這種巧合,很容易找到字元串同時包含單引號、雙引號和雙方括號的情況。但是,Lua 仍然有辦法處理這種情況。

這個問題可以透過在兩個方括號之間使用等號來解決。在 Lua 中,您可以使用等號來區分長括號的級別。例如,[=[Hello, world!]=][==[Hello, world!]==][=====[Hello, world!]=====] 都會生成字串 "Hello, world!"。只需確保您使用相同數量的等號來開始和結束長括號。

程式碼:

= [=[Sally said, "He was reading the [[Schrödinger's cat]] article."]=]

輸出:

Sally said, "He was reading the [[Schrödinger's cat]] article."

您可以在長括號字串中的字串內包含雙括號,只要它們不與開始和結束括號衝突。

程式碼:

= [=[The [[Wikipedia]] article]=]

輸出:

The [[Wikipedia]] article

程式碼:

= [[The [[Wikipedia]] article]]

輸出:

Lua error in console input at line 7: nesting of [[...]] is deprecated near '['.

此外,雙方括號在出現在普通字串中時不會被特殊處理。因此,對於日常使用,最好使用普通字串,並將長括號字串保留用於處理多行或其他需要大量轉義序列的情況。

程式碼:

= "The [[Wikipedia]] article"

輸出:

The [[Wikipedia]] article

連線字串

[編輯 | 編輯原始碼]

您可能經常發現自己想將兩個字串連線在一起。這可以使用連線運算子 .. 來完成。

程式碼:

= "Hello, " .. "Fred!"

輸出:

Hello, Fred!
華夏公益教科書