0Pricing
Lua Academy · レッスン

文字列の基礎:連結と長さ

連結に..、長さの取得に#を使い、string.rep/reverseも利用します。

「文字列の基礎:連結と長さ」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

..による文字列連結

Luaでは、文字列連結に..(ドット2つ)を使います。文字列と数値に対して使うことができ、数値は自動的に変換されます。多くの言語の+とは異なり、Luaの+は算術演算専用です。文字列に+を使うとエラーになります。

local first = "Hello"
local second = "World"
print(first .. ", " .. second .. "!")  -- Hello, World!

-- Numbers auto-converted
local age = 30
print("Age: " .. age)   -- Age: 30

-- Bad: print("x" + "y")  ERROR: arithmetic on string

長さ演算子 #

#演算子は、文字列のバイト長を返します。ASCII文字列では、これは文字数と一致します。マルチバイトのUTF-8文字列では、#は文字数ではなくバイト数を数えます。たとえば、UTF-8の絵文字1文字は4バイトとして数えられます。文字単位で正確な長さが必要な場合は、UTF-8ライブラリを使います。

print(#"hello")        -- 5
print(#"")             -- 0
print(#"café")         -- 5 (c,a,f,é=2bytes)

local s = "Lua"
for i = 1, #s do
  io.write(string.byte(s, i) .. " ")
end
print()  -- 76 117 97

string.repとstring.reverse

string.rep(s, n, sep)は、文字列sを、オプションの区切り文字を挟んで正確にn回繰り返します。string.reverse(s)は、文字列のバイト順を反転します。どちらも新しい文字列を返します。Luaの文字列は変更不可です。

print(string.rep("ab", 3))       -- ababab
print(string.rep("ha", 3, "-"))  -- ha-ha-ha
print(string.rep("x", 0))        -- (empty)
print(string.reverse("hello"))   -- olleh
print(string.reverse("12345"))   -- 54321

string.upperとstring.lower

string.upper(s)とstring.lower(s)は、ASCII文字を変換します。Unicodeには対応していないため、ASCII以外の文字は変更されずにそのまま残ります。大文字と小文字を区別しない比較では、両方の文字列を小文字に変換してから比較します。

print(string.upper("hello"))     -- HELLO
print(string.lower("WORLD"))     -- world
print(string.upper("Lua 5.4!"))  -- LUA 5.4!

-- Case-insensitive comparison
local a = "Hello"
local b = "hello"
print(a:lower() == b:lower())    -- true

コロンによるメソッド構文

文字列値に対してコロン構文を使い、文字列関数を呼び出せます。たとえば、string.upper(s)の代わりにs:upper()と記述します。これは、文字列が__index = stringのメタテーブルを持つためです。その結果、文字列ライブラリのすべての関数を、任意の文字列のメソッドとして利用できます。

local s = "  hello world  "
print(s:upper())         -- HELLO WORLD
print(s:len())           -- 15
print(s:rep(2, "|"))     -- same as string.rep(s,2,"|")

-- Chain calls
print(("lua"):upper():reverse())  -- AUL

文字列の不変性

Luaの文字列は変更不可です。文字をその場で変更することはできません。文字列操作を行うたびに新しい文字列が作成されます。ループ内で大量の連結を行う場合は、テーブルに各部分を蓄積し、最後にtable.concatを使ってください。..を繰り返すよりもはるかに効率的です。

-- Efficient string building
local parts = {}
for i = 1, 5 do
  parts[i] = "item" .. i
end
local result = table.concat(parts, ", ")
print(result)  -- item1, item2, item3, item4, item5

-- Slow! Creates 5 intermediate strings:
-- local s = ""
-- for i = 1, 5 do s = s .. "item" .. i end

結合に使うtable.concat

table.concat(t, sep, i, j)は、配列の要素を区切り文字で連結して文字列にします。文字列と数値の値にのみ対応しており、テーブルやブール値を指定するとエラーになります。多くの部分から文字列を構築する最も高速な方法です。

local parts = {"one", "two", "three", "four"}
print(table.concat(parts, ", "))          -- one, two, three, four
print(table.concat(parts, " | ", 2, 3))  -- two | three

-- Building CSV
local row = {1, "Alice", 95, true}
-- Need tostring for non-string values:
for i, v in ipairs(row) do row[i] = tostring(v) end
print(table.concat(row, ","))

文字列の比較

文字列は、バイト値による辞書順で比較されます。ASCIIでは大文字が小文字より先に来るため(A=65、a=97)、"Z" < "a"はtrueです。大文字と小文字を区別しない順序で比較するには、両方をstring.lowerに渡します。

print("abc" < "abd")    -- true
print("abc" < "abcd")   -- true (shorter)
print("Z" < "a")        -- true (Z=90, a=97)
print("10" < "9")       -- true (lexicographic!)
print(10 < 9)           -- false (numeric)

-- Sort strings case-insensitively
local words = {"Banana","apple","Cherry"}
table.sort(words, function(a,b) return a:lower()<b:lower() end)
print(table.concat(words,", "))

tostring と tonumber

tostring(v)は任意の値を文字列表現に変換します。tonumber(s, base)は文字列を数値として解析します。tonumberは、解析に失敗するとnilを返します。多くの言語では例外が発生する点と異なります。整数の解析では、基数に2〜36を指定できます。

print(tostring(42))        -- 42
print(tostring(true))      -- true
print(tostring(nil))       -- nil
print(tostring({1,2}))     -- table: 0x...

print(tonumber("3.14"))    -- 3.14
print(tonumber("0xff"))    -- 255 (hex)
print(tonumber("11",2))    -- 3 (binary)
print(tonumber("abc"))     -- nil (invalid)

文字列インターニング

Luaでは短い文字列がインターニングされます。同じ内容の文字列は、メモリ上で同じオブジェクトを共有します。そのため、文字列に対する==はハッシュチェック後、実質的にポインタ比較となり、非常に高速です。一方で、インターニングには文字列の作成時にハッシュ計算という小さなオーバーヘッドがあります。ただし、同じ文字列を繰り返し作成する場合のコストは発生しません。

local s1 = "hello"
local s2 = "hel" .. "lo"

-- Same content, interned to same object
print(s1 == s2)   -- true
print(#s1)        -- 5

-- Long strings may not be interned
-- They are still compared correctly by value
local long1 = string.rep("x", 1000)
local long2 = string.rep("x", 1000)
print(long1 == long2)  -- true

確認問題

Luaで、多数の小さな部分文字列から長い文字列を作成する最も効率的な方法は何でしょうか。

まとめ:文字列の基本

重要なポイント:

  • ..は文字列を連結します。文字列に+は決して使用しないでください
  • #sはUnicode文字ではなくバイト数を数えます
  • s:upper()、s:lower()、s:rep(n, sep)、s:reverse()
  • 文字列は不変です。すべての操作は新しい文字列を返します
  • 大きな文字列は、テーブルとtable.concatを使って作成します
  • 型変換にはtostring/tonumberを使用します

よくある質問

「文字列の基礎:連結と長さ」レッスンは無料ですか?

はい。「文字列の基礎:連結と長さ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「文字列の基礎:連結と長さ」で何を学びますか?

連結に..、長さの取得に#を使い、string.rep/reverseも利用します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「文字列の基礎:連結と長さ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 文字列の基礎:連結と長さ
  2. 部分文字列の検索と抽出
  3. 出力のためのstring.format
  4. string.gsubとstring.gmatch
← Lua Academyに戻る