【问题标题】:How can I chain function call in lua?如何在 lua 中链接函数调用?
【发布时间】:2022-01-16 13:05:15
【问题描述】:

我正在尝试创建一个函数来链接函数调用。但是它不起作用。它应该能够在没有任何问题的情况下打印出该值。

这是我的第一次尝试:

local _ = {}
function _.add(x, y) return x + y end
function _.lt(x, y) return x < y end

function _.chain(value)
    local mt = {
        __newindex = function(t, k, v)
            t._value = _[k](t._value, v)
        end
    }
    local chain = {
        _value = value,
        value = function(self)
            return self._value
        end
    }
    chain = setmetatable(chain, mt)
    return chain
end

local value = chain(2).add(5)
print(value)

此解决方案不起作用,因为它应该能够通过 __newindex 元表本地化函数。它没有对函数进行本地化,而是向我抛出了一条错误消息:

lua: main.lua:21: attempt to call a nil value (method 'add')
stack traceback:
    main.lua:21: in main chunk
    [C]: in ?

我解决此问题的第二次尝试是不使用任何元方法:

local _ = {}
function _.add(x, y) return x + y end
function _.lt(x, y) return x < y end

function _.chain(value)
    local t = {
        _value = value;
        value = function (self)
            return self._value
        end
    }
    -- merge methods in t
    for k, v in pairs(_) do
        if type(v) == "function" then
            t[k] = function (self, ...)
                local result = v(self._value, ...)
                if result ~= self._value then
                    self._value = result
                end
                return self
            end
        end
    end
    
    return t
end
local sum = _.chain(2):add(5):value()
print(sum)

此尝试无效,因为它打印出的是 nil 而不是 7

【问题讨论】:

  • 更多的是风格说明,您不应该使用_ 作为您实际计划使用的变量的名称。这样做违反了 _ 是一个你不会使用的变量的名称的习惯用法,通常像 for _, v pairs(t) do 这样使用,只有 v 会在循环体中使用。

标签: function lua


【解决方案1】:

在您的第一次尝试中,您没有向表链添加新字段,因此永远不会调用方法 __newindex,在您的第二次尝试中,我不知道您做错了什么,因为它对我有用,我做到了:

local sum = _.chain(2):add(5):value()
print(sum)

并打印 7

local sum = _.chain(2):add(5):add(3):value()
print(sum)

并打印 10

local sum = _.chain(2):add(5):add(3):add(7):value()
print(sum)

并打印 17

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2017-10-14
    • 2012-04-03
    • 2013-09-04
    • 2013-11-27
    相关资源
    最近更新 更多