3

この変数を使用してBaseModule、変数template_pathと関数で呼び出されるモジュールを作成しました。get_template

module("BaseModule", package.seeall)
template_path = '/BASEMODULE_PATH/file.tmpl'
function get_template()
  print template_path
end

次に、「ChildModule」という別のモジュールを作成します

local BaseModule = require "BaseModule"
module("ChildModule", package.seeall)
setmetatable(ChildModule, {__index = BaseModule})
template_path = '/CHILDMODULE_PATH/file.tmpl'
some_child_specific_variable = 1

そうすることsetmetatableで、すべての変数と関数をからにコピーBaseModuleChildModule(たとえば、それらを継承します)、いくつかのメソッドと変数を新しいモジュールに追加します。

問題は私が電話するときです

ChildModule.get_template

私はそれが戻ることを期待して/CHILDMODULE_PATH/file.tmplいますが、そうではありません。を返します/BASEMODULE_PATH/file.tmpl

ただし、アクセスChildModule.template_pathすると、正しい値(from ChildModule)が含まれています。

LuaにメソッドChildModuleで変数を使用させ、 (親モジュール)変数を使用させないようにするにはどうすればよいですか?Luaにはこのオブジェクトがないので、Luaに現在の値を使用するように指示するにはどうすればよいですか?ChildModule.get_templateBaseModule

4

2 に答える 2

3

廃止されたバージョンの Lua をまだ使用していると思います。とにかく、いくつかの関数を使用してtemplate_path内部に値を設定し、ベースに を設定する必要があります。したがって、次のようなものです。BaseModuletemplate_pathlocal

ベースモジュール

module("BaseModule", package.seeall)
local template_path = "/BASEMODULE_PATH/file.tmpl"
function get_template()
  print(template_path)
end
function set_template( sLine )
  template_path = sLine
end

子モジュール

local BaseModule = require "BaseModule"
module("ChildModule", package.seeall)
setmetatable(ChildModule, {__index = BaseModule})
ChildModule.set_template( "/CHILDMODULE_PATH/file.tmpl" )
some_child_specific_variable = 1
ChildModule.get_template()

継承しているため、base-module のグローバル変数を直接設定しようとしてはいけません。

于 2013-01-21T10:40:40.727 に答える
0

おそらく作成しているオブジェクトのプロパティを操作したいのですが、変数を操作しようとしていると思います。多分このようなもの:

-- base.lua
local M = {}
M.template_path = '/BASEMODULE_PATH/file.tmpl'
function M:get_template()
  return self.template_path
end
return M

-- child.lua
local M = {}
setmetatable(M, {__index = require "base"})
M.template_path = '/CHILDMODULE_PATH/file.tmpl'
M.some_child_specific_variable = 1
return M

-- main.lua
local base = require "base"
local child = require "child"

print(base:get_template(), child:get_template(),
  child.some_child_specific_variable)

これは印刷されます:

/BASEMODULE_PATH/file.tmpl  /CHILDMODULE_PATH/file.tmpl 1

あなたが期待するように。

child.luaところで、ワンライナーに変えることができます:

return setmetatable({template_path = '/CHILDMODULE_PATH/file.tmpl',
  some_child_specific_variable = 1}, {__index = require "base"})

すべきではありませんが、可能です。

于 2013-01-22T06:13:23.170 に答える