明確化(質問は具体的ではありませんでした):どちらもスタック上のアイテムをに変換しようとしますlua_Number
。lua_tonumber
また、数値を表す文字列を変換します。数字ではないものにどのようにluaL_checknumber
対処しますか?
ともluaL_checklong
ありluaL_checkinteger
ます。(int)luaL_checknumber
それらはそれぞれとと同じ(long)luaL_checknumber
ですか?
明確化(質問は具体的ではありませんでした):どちらもスタック上のアイテムをに変換しようとしますlua_Number
。lua_tonumber
また、数値を表す文字列を変換します。数字ではないものにどのようにluaL_checknumber
対処しますか?
ともluaL_checklong
ありluaL_checkinteger
ます。(int)luaL_checknumber
それらはそれぞれとと同じ(long)luaL_checknumber
ですか?
リファレンスマニュアルはこの質問に答えます。Lua 5.2リファレンスマニュアルを引用していますが、5.1マニュアルにも同様のテキストがあります。ただし、マニュアルは非常に簡潔です。1つの事実が複数の文で言い換えられることはめったにありません。さらに、API関数のより深い意味を理解するために、広く分離されたセクションに記載されている事実を相互に関連付ける必要があることがよくあります。
これは欠陥ではなく、仕様によるものです。これは言語のリファレンスマニュアルであり、その主な目的は言語を完全に(そして正しく)説明することです。
「方法」と「理由」の詳細については、Luaのプログラミングも読むことをお勧めします。オンラインコピーは、Lua 5.0について説明しているため、かなり長くなっています。現在の紙の版はLua5.1を説明しており、Lua5.2を説明する新しい版が進行中です。とは言うものの、バージョン5.0以降の言語の変更点にも注意を払う限り、初版でさえ優れたリソースです。
luaL_check*
リファレンスマニュアルには、機能ファミリについてかなりの量が記載されています。
各APIエントリのドキュメントブロックには、スタックの使用を説明するトークンが付属しており、どのような条件(存在する場合)でエラーがスローされます。これらのトークンについては、セクション4.8で説明しています。
各関数には、次のようなインジケーターがあります。
[-o, +p, x]
最初のフィールドoは、関数がスタックからポップする要素の数です。2番目のフィールドpは、関数がスタックにプッシュする要素の数です。(どの関数も、引数をポップした後は常に結果をプッシュします。)x | yの形式のフィールドは、状況に応じて、関数がxまたはy要素をプッシュ(またはポップ)できることを意味します。疑問符'?' つまり、引数だけを見ても、関数がポップ/プッシュする要素の数を知ることはできません(たとえば、スタックの内容に依存する場合があります)。3番目のフィールドxは、関数がエラーをスローする可能性があるかどうかを示します。'-'は、関数がエラーをスローしないことを意味します。「e」は、関数がエラーをスローする可能性があることを意味します。「v」は、関数が意図的にエラーをスローする可能性があることを意味します。
luaL_
補助ライブラリ全体(名前が単にではなくで始まる公式APIのすべての関数)を文書化した第5章の冒頭で、次のlua_
ことがわかります。
補助ライブラリのいくつかの関数は、C関数の引数をチェックするために使用されます。エラーメッセージは引数(「badargument#1」など)用にフォーマットされているため、他のスタック値にはこれらの関数を使用しないでください。
luaL_check *と呼ばれる関数は、チェックが満たされない場合、常にエラーをスローします。
関数luaL_checknumber
はトークン[-0,+0,v]
で文書化されています。これは、スタックを妨害せず(何もポップせず、何もプッシュしない)、意図的にエラーをスローする可能性があることを意味します。
より具体的な数値タイプを持つ他の関数は、主に関数のシグネチャが異なります。すべてはluaL_checkint()
「関数の引数が数値であるかどうかをチェックarg
し、この数値のキャストをに返す」と同様に説明int
され、キャストで指定されたタイプを適切に変更します。
関数は、スタックに影響を与えず、エラーをスローしないことを意味するlua_tonumber()
トークンで記述されています。[-0,+0,-]
指定されたスタックインデックスから数値を返すか、スタックインデックスに十分な数値が含まれていない場合は0を返すことが文書化されています。lua_tonumberx()
数値の変換に成功したかどうかを示すフラグも提供する、より一般的な関数を使用することが文書化されています。
また、すべて同じ変換を実行するが結果をキャストする、より具体的な数値タイプで名前が付けられた兄弟があります。
最後に、ソースは意図されたとおりに言語を説明していることを理解した上で、ソースコードを参照することもできますが、ソースはその言語の特定の実装であり、バグがあるか、実装の詳細が明らかになる可能性があります。将来のバージョンで変更される可能性があります。
ソースluaL_checknumber()
はにありlauxlib.c
ます。フォーマットされたエラーメッセージを実際にスローするために実装されたを呼び出すlua_tonumberx()
内部関数の観点から実装されていることがわかります。tagerror()
typerror()
luaL_argerror()
どちらもスタック上のアイテムをlua_Numberに変換しようとします。lua_tonumberは、数値を表す文字列も変換します。luaL_checknumberは、変換に失敗すると(Lua)エラーをスローします。長いジャンプが発生し、C関数のPOVから戻ることはありません。lua_tonumberは単に0を返します(これも有効な戻り値になる可能性があります)。したがって、最初にlua_isnumberでチェックするよりも高速なこのコードを記述できます。
double r = lua_tonumber(_L, idx);
if (r == 0 && !lua_isnumber(_L, idx))
{
// Error handling code
}
return r;