12

setfenv()Luaをからに切り替えることの大きな問題は何_ENVですか?

さまざまな「What'sNew」ソースで、この動きはLuaバージョン5.1と5.2の間の最も重要な変更の1つとして言及されています。

ただし、PILやその他の場所で示されている例は、次のようにトリミングできます。

-- Lua 5.1                   -- Lua 5.2
function myfunc()            function myfunc()
    setfenv(1, {})               _ENV = {}
end                          end

これまでのところ、ここで得たのは、5つのキーストロークを節約したことです。(C側と大差ないと思います。)また、うまくいけば、関数の内側からしかアクセスできないのsetfenv()に対し、関数の外側と内側の両方から使用できます。_ENV(もちろん、C APIを使用する場合、アップバリューに直接アクセスできます。)私が書いたものから、5.2アプローチははるかに柔軟性が低いようです。

のTheNoveltiesofLua 5.2で、Robertoは次のように書いています。

「糖衣構文であるため、古い環境よりもはるかに単純です」

シンプルさはどこにありますか?私は何を見落としましたか?

このトピックは、5.2ユーザーマニュアルに記載されているよりも適切に扱う価値があると思います。

4

2 に答える 2

9

シンプルさはどこにありますか?

それはあなたが「シンプルさ」をどのように定義するかに依存します。

Lua 5.1では、環境はシステム内の他の設定とは異なり、魔法のような神秘的な設定でした。明示的な場所はなく、標準ライブラリ機能を使用してのみ設定できました。

Lua 5.2では、他の環境と同じように、環境は変数です。使用できる名前が付いています。したがって、何が起こっているのかがより明確になるという点で、より単純です。

さらに、Lua 5.1では、関数の環境を動的に変更できます。

Lua 5.2では、直接のアップバリュー操作以外では、関数に環境が設定されると、それが永続的に保持される環境になります。関数の環境は継承され、通常のlocal変数のように字句スコープが設定されます。したがって、コードを見ると、関数がどの環境にあるかを簡単に確認できます。local _ENVその関数の作成範囲にない場合、環境はチャンクの環境(load呼び出しによって定義される)になります。

于 2012-08-19T02:29:51.790 に答える
5

私の知る限り、Lua 5.2の環境の主な欠点は、外部から設定できないことです。つまり、言うことはできませんsetfenv(func, {})。私の意見では、これは大きな失敗です。それは確かにLua5.1の環境よりも単純ですが、良い方法ではありません。

于 2012-08-19T02:26:54.653 に答える