0

「luafunc.lua」にコードがあるとします。

function foo(a, b)
   return a + b
end

a = io.read('*n')
b = io.read('*n')
print (foo(a, b))

C++ ファイルから関数 foo を使用してみましょう:

#include <iostream>

using namespace std;

extern "C"{
    #include <lua.h>
    #include <lualib.h>
    #include <lauxlib.h>
};

int main()
{
    lua_State *lvm = lua_open();
    luaL_openlibs(lvm);
    luaL_loadfile(lvm, "luafunc.lua");

    int a, b;
    cin >> a >> b;
    lua_pcall(lvm, 0, LUA_MULTRET, 0);
    lua_getglobal(lvm, "foo");
    lua_pushnumber(lvm, a);
    lua_pushnumber(lvm, b);
    if (lua_pcall(lvm, 2, 1, 0))
    {
        cout << "Error: " << lua_tostring(lvm, -1) << endl;
        return 0;
    }

    cout << "The result is: " << lua_tonumber(lvm, -1) << endl;

    lua_close(lvm);
    return 0;
}

したがって、問題は、この C++ コードが luafunc.lua 全体を実行することです。当然、lua ファイルから読み取り部分を削除して、C++ からは foo のみを実行します。しかし、lua-file に他のものがあっても、C++ から関数 foo を使用できますか?

4

2 に答える 2

4

そのコードを実行せずにその関数を使用できるようにする必要がある場合は、コードと関数を 2 つの別個のスクリプトに分けます。fooそれを含むスクリプトと、そのスクリプトと tests をロードするスクリプトfooです。

関数は、それを含むスクリプトが実行されるまで定義されません。そのスクリプトを実行するfooと、他の 3 行も定義されて実行されます。

loaL_loadfile (またはその他のロード呼び出し)を使用してファイルをロードすると、スクリプト全体が関数に変換されます。それを実行するには、lua_pcallなどでその関数を呼び出す必要があります。それまでは、foo を定義するスクリプトは、スタック上の名前のない未実行のコードの塊です。

スクリプトの一部だけを実行したり、関数定義だけを実行したりする関数はありません。

于 2012-05-04T17:42:32.810 に答える
3

lua-file に他のものがあっても、C++ から関数 foo を使用できますか?

はい。

そのファイルの他の部分を実行せずに使用できますか? いいえ。

Lua 関数は実行時に定義されます。そのスクリプトをロードしてコンパイルするだけでは十分ではありません。結果のチャンクを実行してfoo、Lua 状態で定義する必要があります。

于 2012-05-04T19:56:35.957 に答える