2017-11-12 5 views
1

を経由して「名前空間を使用して」私はファイルfoo.lua持っている場合:bar.luaに私はfoo.add()すべての時間を入力することで悩まされていますfoo.luaからコードを多用すると書き込みを好むだろうCをエミュレート++ _ENV

local foo = {} 
foo.add = function(a, b) return a+b end 
foo.sub = function(a, b) return a-b end 
foo.multiply = function(a, b) return a*b end 
return foo 

とを

local foo = require('foo') 
local add, sub, multiply = foo.add, foo.sub, foo.multiply 

をそれはあなたが多くのファイルから多くの値をエイリアシングを含めているの痛みであることを開始します:ちょうどadd()bar.luaで私はこれを追加することができます。

私はあなたがそうのように、この機能をエミュレートすることができ考えていたLUAでは
#include <iostream> 
using namespace std 

は:C++ではこれを回避する方法があるので、

私はそれを伝えることができるものから
local foo = require('foo') 
setmetatable(_ENV, {__index = foo}) 

はスコープを尊重し、コードのようなもの下記のコードは実際には動作しません:

実際には以下のコードは機能しません。私はlua replを使ってコードを実行していました。私が以下のコードスニペットをluaファイルに書いたとき、望みの結果が得られなかった。

f = function() -- returns 2 
    setmetatable(_ENV, {__index = foo}) 
    return add(1, 1) 
end 
add(1, 1) -- returns 2 

私はこれを後悔するかもしれない何らかの理由がありますか? (using namespaceに賛成する理由以外)

+0

このような方法でC++を使用することはますます貧弱な方法であると考えられています。 –

+1

私はC++で人気がない理由を知っていますが、私はこのスレッドに応答してから、私のluaコード全体にこれを入れ始めます。私は、コードを読みにくくするために可能な限り理解するために高度な知識が必要なコードを書くことは避けがちですが、これは明らかにそのルールに違反します。ちょっと気になっただけ。 – Julian

答えて

1

地球環境を変更することは他のライブラリには丁寧ではありません。 addは元_ENVfooprintに解決されることを

do 
    local _ENV = setmetatable(foo, {index = _ENV}) 
    print(add(1, 1)) 
end 

注:

は、他の方法で回避してみてください。

関連する問題