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

Vin*_*ino 3 lua function

我正在尝试创建一个函数来链接函数调用。但是它不起作用。求和后应该能够毫无问题地打印出该值。

这是我的第一次尝试:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

此尝试不起作用,因为它打印出nil而不是7.

小智 5

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

local sum = _.chain(2):add(5):value()
print(sum)
Run Code Online (Sandbox Code Playgroud)

并打印 7

local sum = _.chain(2):add(5):add(3):value()
print(sum)
Run Code Online (Sandbox Code Playgroud)

并打印了10

local sum = _.chain(2):add(5):add(3):add(7):value()
print(sum)
Run Code Online (Sandbox Code Playgroud)

并打印了17