Lua-如何将对象的函数作为参数传递给另一个函数

雷贾克斯
local a = {}
function a:test1(value)
    print(value)
end
local b = {}
function b:test2(v1, v2)
    v2(100);
end
b:test2(_, a.test1)

不起作用 值是零。我可以找到在匿名函数中进行封装的解决方案

b:test2(variable, function(value) a:test1(value) end)

但是我觉得这很糟糕

正确的语法是什么?

瑞安·斯坦(Ryan Stein)

anotherObject:aFunction(variable, object.doStuff) 是正确的语法。

:在函数中使用冒号只是将隐式self参数作为第一个参数的调用或声明的语法糖如果您想以更简洁的方式遵循示例中显示的模式,则可以使用辅助函数。

local function bind(t, k)
    return function(...) return t[k](t, ...) end
end

然后,您可以像这样应用它。

anotherObject:aFunction(variable, bind(object, 'doStuff'))

编辑:我认为要解决您的问题,就需要在一定程度上进行绑定,而无需修改Lua解释器或使用代码翻译步骤。从根本上讲,这是因为Lua中的函数不携带有关其来源的任何信息,表并不固有地拥有它们存储的功能

例如,以下是完全合法的Lua代码。

function Circle:area() -- function Circle.area(self)
    -- ...
end

-- Evaluate the function in the "area" slot with Square as the self parameter.
Circle.area(Square)

当然,您可以尝试进行范式转换,但是如果您基于函数绑定到已被索引的表的想法构建整个应用程序,那可能为时已晚,如上所述。因此,我提出以下疯狂的解决方案。

local mt = {}

function mt:__index(k)
    local v = self._slots[k]

    if v == nil then
        -- Ascend the inheritance tree.

        -- This has to be done with rawget all the way up,
        -- otherwise inherited functions would be repeatedly bound.
        local p = self

        repeat
            p = rawget(p, '_parent')
            if not p then break end
            v = p._slots[k]
        until v
    end

    if type(v) == 'function' then
        -- Return a self-bound version of the function.
        return function(...) return v(self, ...) end
    end

    return v
end

function mt:__newindex(k, v)
    self._slots[k] = v
end

--- Demo & Tests ---

local function Object(parent)
    local o = setmetatable({_slots = {}}, mt)
    if parent then rawset(o, '_parent', parent) end
    return o
end

local o1 = Object()
local o2 = Object(o1)

assert(o1.abc == nil, 'o1.abc should be nil')
o1.abc = 3
assert(o1.abc == 3, 'o1.abc should be 3')
assert(o2.abc == 3, 'o2.abc should be 3, inherited from o1')
o2.abc = 7
assert(o2.abc == 7, 'o2.abc should be 7, overriding o1')
assert(o1.abc == 3, 'o1.abc should be 3, unaffected by o2 setter')

function o1:test(bar)
    return self.abc + bar
end

assert(type(o1.test) == 'function', 'o1.test should be a function')
assert(type(o2.test) == 'function', 'o2.test should be a function, inherited from o1')

assert(o1.test(5) == 8, 'o1.test(5) should return 3 + 5 = 8')
assert(o2.test(11) == 18, 'o2.test(11) should return 7 + 11 = 18')

function o2:test2(fn)
    return self.abc + fn(7)
end

assert(o2.test2(o1.test) == 17, 'o2.test2(o1.test) should return 7 + (3 + 7) = 17')

o2.test3 = o1._slots.test -- proper function copying
assert(o2.test3(11) == 18, 'o2.test3(5) should return 7 + 11 = 18')

o2.abc = nil
assert(o2.abc == 3, 'o2.abc should be 3 again, inherited from o1 after clearing')

o2.abc = false
assert(o2.abc == false, 'o2.abc should be false, __index needs to differentiate between nil and false')

该元表将为您提供所需的内容,并带有继承的和绑定的功能来引导。您只需要确保要遵循此模式的所有表都遵循示例代码中显示的对象创建方法即可。

为了说明,以这种方式创建的每个表都将任何新的分配重定向到_slots子表中,并且任何新的检索都要检查_parent继承树。如果该值的类型为function,则它将返回一个新的闭包,该闭包具有self开始检查的原始绑定到找到的函数。

显然,使用:冒号语法从这些对象之一调用函数将是一个愚蠢的主意,因为它的计算结果为o.fn(o, o),而这可能并不是您想要的。另一个警告是,将功能这些对象复制到这些对象将无法按预期进行。o1.newfn = o2.fn将放入一个o2绑定函数o1,然后将其重新绑定到o1最终结果将是类似o2.fn(o2, o1)您将不得不从_slots表中复制函数


结束语:即使这样做行得通,但从长远来看,我个人不建议这样做,因为这可能会使习惯于Lua如何使用表,索引和函数的任何人感到困惑,并且产生开销。您可能能够通过废除一些它memoizing封盖,但我会离开这个决定取决于你。祝好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Lua-如何将对象的函数作为参数传递给另一个函数

来自分类Dev

在Lua中是否可以将参数绑定到作为参数传递给另一个函数的回调函数?(JavaScript的“绑定”等效项)

来自分类Dev

带arg的Lua函数传递给带arg的另一个函数

来自分类Dev

如何将可变函数参数作为参数传递给另一个函数?

来自分类Dev

如何将参数传递给作为另一个函数参数的函数

来自分类Dev

将对象传递给Lua函数始终引用自身

来自分类Dev

如何将对象的动态数组传递给另一个类的参数化构造函数?

来自分类Dev

在Lua中,如何从作为参数传递给函数的函数中获取函数的参数?

来自分类Dev

如何将tanh函数作为参数传递给另一个函数?

来自分类Dev

如何将函数作为参数传递给另一个函数?

来自分类Dev

如何将泛型函数作为参数传递给另一个函数?

来自分类Dev

jQuery如何将对象传递给另一个函数

来自分类Dev

Lua:带引号的参数在函数中作为一个传递

来自分类Dev

如何或可以将带有参数作为参数的函数传递给lua中的函数?

来自分类Dev

从Fortran将数组作为函数参数传递给lua

来自分类Dev

将表作为参数传递给Lua中的函数

来自分类Dev

如何让lua加载另一个lua脚本?

来自分类Dev

如何将一个函数作为参数传递给另一个函数

来自分类Dev

R-如何将一个函数作为参数传递给另一个函数?

来自分类Dev

将一个函数放在lua的另一个函数中是否会提高lua的性能?

来自分类Dev

如何将带有参数作为参数的函数传递给Python中的另一个函数?

来自分类Dev

如何将空变量传递给Lua中的函数

来自分类Dev

如何将以args作为参数的成员函数传递给另一个成员函数?

来自分类Dev

如何将非静态成员函数作为模板参数传递给另一个成员函数?

来自分类Dev

Python:如何将函数作为参数传递给另一个函数,而不自动运行它

来自分类Dev

如何将另一个函数作为变量传递给R中的函数?

来自分类Dev

如何执行将细节作为参数传递给另一个函数的函数

来自分类Dev

如何将命名参数传递给另一个函数需要的函数?

来自分类Dev

如何将指针传递给在另一个结构内部声明的结构作为函数参数?

Related 相关文章

  1. 1

    Lua-如何将对象的函数作为参数传递给另一个函数

  2. 2

    在Lua中是否可以将参数绑定到作为参数传递给另一个函数的回调函数?(JavaScript的“绑定”等效项)

  3. 3

    带arg的Lua函数传递给带arg的另一个函数

  4. 4

    如何将可变函数参数作为参数传递给另一个函数?

  5. 5

    如何将参数传递给作为另一个函数参数的函数

  6. 6

    将对象传递给Lua函数始终引用自身

  7. 7

    如何将对象的动态数组传递给另一个类的参数化构造函数?

  8. 8

    在Lua中,如何从作为参数传递给函数的函数中获取函数的参数?

  9. 9

    如何将tanh函数作为参数传递给另一个函数?

  10. 10

    如何将函数作为参数传递给另一个函数?

  11. 11

    如何将泛型函数作为参数传递给另一个函数?

  12. 12

    jQuery如何将对象传递给另一个函数

  13. 13

    Lua:带引号的参数在函数中作为一个传递

  14. 14

    如何或可以将带有参数作为参数的函数传递给lua中的函数?

  15. 15

    从Fortran将数组作为函数参数传递给lua

  16. 16

    将表作为参数传递给Lua中的函数

  17. 17

    如何让lua加载另一个lua脚本?

  18. 18

    如何将一个函数作为参数传递给另一个函数

  19. 19

    R-如何将一个函数作为参数传递给另一个函数?

  20. 20

    将一个函数放在lua的另一个函数中是否会提高lua的性能?

  21. 21

    如何将带有参数作为参数的函数传递给Python中的另一个函数?

  22. 22

    如何将空变量传递给Lua中的函数

  23. 23

    如何将以args作为参数的成员函数传递给另一个成员函数?

  24. 24

    如何将非静态成员函数作为模板参数传递给另一个成员函数?

  25. 25

    Python:如何将函数作为参数传递给另一个函数,而不自动运行它

  26. 26

    如何将另一个函数作为变量传递给R中的函数?

  27. 27

    如何执行将细节作为参数传递给另一个函数的函数

  28. 28

    如何将命名参数传递给另一个函数需要的函数?

  29. 29

    如何将指针传递给在另一个结构内部声明的结构作为函数参数?

热门标签

归档