4

簡単な質問: まだ実装されていない関数のプロトタイプを設定するにはどうすればよいですか?

私はこれをやりたいだけです。(まだ)存在しない関数を参照しているためです。C では、次のようにします。

int foo(int bar);

int myint = foo(1);

int foo(int bar)
{
     return bar;
}

Lua(コロナあり)でこれを行うにはどうすればよいですか?

4

1 に答える 1

7

できません。アンバーのコメントは正しいです。

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で宣言されているように_Gmainアクセスできます。

于 2012-04-22T20:56:42.967 に答える