簡単な質問: まだ実装されていない関数のプロトタイプを設定するにはどうすればよいですか?
私はこれをやりたいだけです。(まだ)存在しない関数を参照しているためです。C では、次のようにします。
int foo(int bar);
int myint = foo(1);
int foo(int bar)
{
return bar;
}
Lua(コロナあり)でこれを行うにはどうすればよいですか?
できません。アンバーのコメントは正しいです。
Lua には型シグネチャや関数プロトタイプの概念がありません。
の型はfoo
、それに含まれるオブジェクトの型であり、実行時に動的に変化します。それはあるfunction
瞬間string
かもしれinteger
ませんし、次の瞬間かもしれません。
概念的には、Lua には C のようなコンパイル ステップがありません。「このコードを実行してください」と言うと、最初から命令の実行が開始され、下の方で動作します。実際には、Luaはコードを実行する前にまずコードをバイトコードにコンパイルしますが、コンパイラは次のようなことで躊躇しません。
greet()
function greet()
print('Hello.')
end
に含まれる値greet
は実行時に決定されるためです。実行時に の値を実際に呼び出そうとする(つまり、関数のように呼び出す)場合にのみ、呼び出し可能な値 (関数、またはメンバーgreet
を含むメタテーブルを持つテーブル/ユーザーデータ) が含まれていないことを Lua が検出します。__call
実行時エラーが発生します:「グローバル 'greet' (nil 値) を呼び出そうとしています」。「nil value」はgreet
、呼び出しが試行された時点で含まれていた値です。私たちの場合、それはでしたnil
。
foo
したがって、を呼び出す前に、関数を作成して割り当てるコードが呼び出されることを確認する必要がありますfoo
。
次のことを認識すると役立つ場合があります。
local myint = foo(1)
function foo(bar)
return bar
end
これの構文シュガーは次のとおりです。
local myint = foo(1)
foo = function(bar)
return bar
end
foo
関数値が割り当てられています。その関数を呼び出す前に、それが発生する必要があります。
main
関数を呼び出して「実行時間」を開始します。
例えば:
function main()
greet()
end
function greet()
print('Hello.')
end
main()
greet
で宣言されているように_G
、main
アクセスできます。