型強制と型変換
文字列と数値の自動的な型強制、および明示的なtonumber/tostringを学習します。
「型強制と型変換」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
型強制とは何か
型強制とは、文脈上必要になったときに、ある型の値を別の型へ自動的に変換することです。Luaが型強制を行う方向は2つに限られます。算術演算の文脈での文字列から数値への変換と、連結の文脈での数値から文字列への変換です。
JavaScriptとは異なり、Luaの型強制は限定的で予測しやすいものです。ブール値を数値に変換したり、テーブルを文字列に自動変換したりすることはありません。
-- String to number (arithmetic context)
print("10" + 5) -- 15 (coerced)
print("3.14" * 2) -- 6.28
-- Number to string (concatenation context)
print(10 .. "px") -- 10px
print(3.14 .. "!") -- 3.14!
-- No boolean coercion
-- print(true + 1) -- ERROR!文字列から数値への型強制ルール
文字列が算術式に現れると、Luaはそれを数値に変換しようとします。文字列が有効な数値を表していない場合は、実行時エラーが発生します。有効な数値文字列には、整数("42")、浮動小数点数("3.14")、16進数("0xff")、指数表記("1e3")があります。
先頭や末尾に空白がある文字列も受け付けられます。Luaは型強制の際に空白を取り除きます。
print("42" + 0) -- 42 (integer)
print("3.14" + 0) -- 3.14 (float)
print("0xff" + 0) -- 255 (hex)
print(" 10 " + 0) -- 10 (whitespace ok)
print("1e3" + 0) -- 1000.0
-- This will error:
-- print("hello" + 0) -- attempt to perform arithmetic on a string value数値から文字列への型強制
数値を..で連結すると、Luaは数値を自動的に文字列へ変換します。整数は10進数表記になり、浮動小数点数には小数点以下の桁が付加される場合があります。形式を正確に制御するには、暗黙の型強制に頼らず、常にtostring()またはstring.format()を使用してください。
print(10 .. "!") -- 10!
print(3.14 .. "!") -- 3.14!
print(1/3 .. "!") -- 0.33333333333333!
-- Explicit is better for precision
print(string.format("%.2f", 1/3)) -- 0.33
print(tostring(10)) -- 10
print(tostring(10.0)) -- 10.0tonumber(): 明示的な変換
tonumber(v)は値を明示的に数値へ変換します。成功すると変換後の数値を返し、変換に失敗するとnilを返します。エラーを発生させることはありません。整数の解析では、2〜36の基数をオプションで指定でき、2進数、8進数、16進数などを変換できます。
ユーザー入力を処理するときは、tonumber()の戻り値がnilかどうかを必ず確認してください。
print(tonumber("42")) -- 42
print(tonumber("3.14")) -- 3.14
print(tonumber("0xFF")) -- 255
print(tonumber("hello")) -- nil (no error!)
print(tonumber(true)) -- nil
-- Base conversion
print(tonumber("ff", 16)) -- 255
print(tonumber("11", 2)) -- 3 (binary)
print(tonumber("77", 8)) -- 63 (octal)tostring(): 明示的な変換
tostring(v)は任意の値を文字列へ変換します。数値の場合は、10進数表記または指数表記の文字列を生成します。ブール値の場合は"true"または"false"を生成します。nilの場合は"nil"を返します。テーブルや関数の場合は、__tostringメタメソッドが定義されていなければ、"table: 0x..."のようなアドレスを返します。
print(tostring(42)) -- 42
print(tostring(3.14)) -- 3.14
print(tostring(true)) -- true
print(tostring(false)) -- false
print(tostring(nil)) -- nil
print(tostring({})) -- table: 0x...
-- Useful for safe concatenation
local val = nil
local msg = "Value: " .. tostring(val)
print(msg) -- Value: nilmath.tointeger()
math.tointeger(x)(Lua 5.3以降)は、値が正確な整数表現を持つ場合に限り、浮動小数点数を整数へ変換します。変換によって精度が失われる場合はnilを返します。常に成功するものの、暗黙に切り捨てる可能性があるmath.floor()より安全です。
APIとの連携など、正確な整数であることを厳密に検証する必要がある場合に使用してください。
print(math.tointeger(5.0)) -- 5 (exact)
print(math.tointeger(5.5)) -- nil (not exact)
print(math.tointeger(2^53)) -- 9007199254740992
-- Contrast with math.floor
print(math.floor(5.9)) -- 5 (truncates)
print(math.floor(5.0)) -- 5
-- Check before use
local n = math.tointeger(val) or error("need integer")比較における型強制
Luaは等価比較で型強制を行いません。1 == "1"は、オペランドの型が異なるため常にfalseです。ただし、関係演算子(<、>など)では、文字列と数値の間で型強制が行われます。ただし、両方のオペランドが同じ型の場合に限ります。順序比較で型を混在させるとエラーになります。
print(1 == "1") -- false (no coercion)
print(1 == 1.0) -- true (int/float equal)
-- Ordering: same type only
print("abc" < "abd") -- true (string compare)
print(1 < 2) -- true (number compare)
-- This ERRORS: mixing string and number
-- print(1 < "2") -- attempt to compare number with string実践: ユーザー入力の解析
Luaプログラムでは、ユーザー入力(たとえばio.read()経由)から文字列を読み取り、それを数値へ変換するパターンが非常によく使われます。無効な入力でクラッシュするのを避け、適切に処理するために、必ずtonumber()を使用してnilかどうかを確認してください。
-- Safe input parsing pattern
local function parseNumber(input)
local n = tonumber(input)
if n == nil then
return nil, "Invalid number: " .. tostring(input)
end
return n, nil
end
local val, err = parseNumber("42")
print(val, err) -- 42 nil
local val2, err2 = parseNumber("abc")
print(val2, err2) -- nil Invalid number: abc整数と浮動小数点数の精度に関する注意点
浮動小数点数の精度には限界があります。整数と浮動小数点数を混在させる演算では、IEEE 754表現の影響で予期しない結果になる場合があります。倍精度浮動小数点数で正確に表現できる最大の整数は2^53 = 9,007,199,254,740,992です。これを超える整数は、浮動小数点数として格納すると精度が失われます。
Lua 5.3以降の標準の64ビット整数では、最大で2^63-1までの値を正確に扱え、より大きな範囲を表現できます。正確さが重要な場合は、常に整数演算を使用してください。
-- Float precision limit
print(2^53) -- 9.007...e+15
print(2^53 + 1 == 2^53) -- true (precision lost!)
-- Integer stays exact
local big = math.maxinteger
print(big) -- 9223372036854775807
print(math.type(big)) -- integer
-- Mixing promotes to float
print(math.type(1 + 1.0)) -- float文字列形式への変換
string.format()は、精度、パディング、表記法を制御したい場合に、数値を文字列へ変換する最も強力なツールです。C言語のprintf形式指定子に従います。表示、ファイル出力、その他デフォルトのtostring()表現では不十分なあらゆる場面で使用してください。
print(string.format("%d", 255)) -- 255
print(string.format("%x", 255)) -- ff
print(string.format("%05d", 42)) -- 00042
print(string.format("%.2f", 3.14159)) -- 3.14
print(string.format("%e", 12345.0)) -- 1.234500e+04
print(string.format("%s=%d", "x", 10)) -- x=10クイックチェック
Luaでtonumber("hello")は何を返しますか?
復習: 型強制と変換
学習した内容:
- Luaは算術演算で文字列を数値へ、連結で数値を文字列へ自動的に型強制します
tonumber()は失敗するとnilを返します。必ず確認してくださいtostring()は任意の値を安全に文字列へ変換します- 等価演算(
==)では型強制は行われず、異なる型同士は決して等しくなりません - 数値を正確に形式化するには
string.format()を使用します - 浮動小数点数の精度の限界は2^53です。大きく正確な値には標準の整数を使用してください
次は、if/elseif/elseとループによる制御フローです。
よくある質問
「型強制と型変換」レッスンは無料ですか?
はい。「型強制と型変換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「型強制と型変換」で何を学びますか?
文字列と数値の自動的な型強制、および明示的なtonumber/tostringを学習します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「型強制と型変換」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。