【问题标题】:Lua :new from C APILua:来自 C API 的新功能
【发布时间】:2014-08-06 18:37:10
【问题描述】:

我正在为我的游戏引擎编写脚本层。目前我正在使用一个脚本作为一个类,向名为 new 的“表”添加一个方法。这个函数基本上创建了类的实例化副本。当需要脚本实例时,我会从 C API 调用此函数。

function PlayerController:new(o)
    print('A new instance of the PlayerController has been created');

    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end

我的问题是:如何获取上述 Lua 代码,并将其移动到 C 中,这样就不需要将其添加到我为该系统编写的每个脚本文件中?

【问题讨论】:

  • 坏主意。为什么不能只使用 lua 脚本(可能会调用其他脚本)来初始化 lua 状态并将主机提供的任何功能放入适当的 Lua 类中?这更容易编写、更容易维护和更容易扩展。也不应该损害性能。
  • 另外,考虑使用调用元方法来定义类和实例化它们。
  • 我不确定我是否遵循。另外,为什么以编程方式向我的每个脚本添加“新”方法是个坏主意?只是好奇。另外,我正在研究元方法。
  • 坏主意,因为这在 Lua 中要容易得多。一个好的框架(10 分钟来构建你自己的基本框架,自然地在 Lua 本身中)应该主要消除对 new-function 的需求。
  • 我建议您使用许多 Lua OOP 框架之一,例如 LOOP。

标签: c oop scripting lua lua-api


【解决方案1】:

您可能想要创建一个类声明函数来为您完成此操作。这是一个完整的“helper.lua”文件:

local lib = {type = 'helper'}
local CALL_TO_NEW = {__call = function(lib, ...) return lib.new(...) end}

function lib.class(class_name, tbl)
  local lib = tbl or {}
  lib.type = class_name
  lib.__index = lib

  -- Default "new" method
  function lib.new()
    return setmetatable({}, lib)
  end

  -- Enable foo.Bar() instead of foo.Bar.new()
  return setmetatable(lib, CALL_TO_NEW)
end
return lib

使用示例:

local helper = require 'helper'
local lib = helper.class 'foo.Bar'

-- optional new function if there needs to be some argument handling
function lib.new(args)
  local self = {}
  -- ...
  return setmetatable(self, lib)
end

return lib

lub.class

这是一个真实世界的最小类声明和设置系统。在xml、yaml、dub等很多luarocks中都有使用:

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 2013-12-04
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多