1. ホーム
  2. lua

グローバルな 'setmetatable' (nil 値) または同様のものを呼び出そうとすると、lua がエラーを報告する。

2022-02-20 11:27:52

    モジュールを増やしてluaを書くと、このミスをしやすいのでメモです。 setmetatableは_Gテーブルの下に実装されているメソッドですが、モジュールを使うと環境ごとスタックされるので、グローバルメソッドが見れないというエラーになります。で、一般的にmodule(... , package.seeall)と書くのは、グローバルな環境を見えるようにするためです。





    しかし、setmetatable(_M, {__index = xxx}) を使用する場合、この xxx が nil の場合はどうなるのだろうという疑問が生じます。この方法では、メタテーブルとしてのモジュールにnull値を代入してしまうので、環境全体が見えなくなり、当然、entry to call global 'setmetatable'(a nil value)といったエラーが報告されることになります。