如何在 lua 中链式调用函数?

我正在尝试创建一个可以链式调用函数的函数。然而,它没有起作用。它应该能够在执行求和之后打印出值,而不会出现任何问题。

以下是我的第一次尝试:

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
    }
    -- 将方法合并到 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

原文链接 https://stackoverflow.com/questions/70328217

点赞
stackoverflow用户16532632
stackoverflow用户16532632

在你的第一次尝试中,你没有向表链中添加新字段,因此方法 __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

2021-12-12 23:11:11