如何在 lua 中链接函数调用?
How can I chain function call in 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
}
-- 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
。
在您的第一次尝试中,您没有向 table 链中添加新字段,因此永远不会调用方法 __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
我正在尝试创建一个函数来链接函数调用。但是它不起作用。求和后应该能够打印出值,没有任何问题。
这是我的第一次尝试:
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
。
在您的第一次尝试中,您没有向 table 链中添加新字段,因此永远不会调用方法 __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