Methods Lua:我如何连接方法,就像连接字符串方法一样?
字符串函数可以通过以下方式使用:Methods Lua:我如何连接方法,就像连接字符串方法一样?,methods,lua,concatenation,Methods,Lua,Concatenation,字符串函数可以通过以下方式使用: string.FUNCTION('myString', PARAMETER) 或者将“string”替换为要使用的字符串,并将其作为方法调用 ('myString'):METHOD(PARAMETER) 最后一种方法非常易于读取,并允许连接方法 -- example string operation some_str, pos = ' some string', 1 -- default string syntax while string.find(s
string.FUNCTION('myString', PARAMETER)
或者将“string”替换为要使用的字符串,并将其作为方法调用
('myString'):METHOD(PARAMETER)
最后一种方法非常易于读取,并允许连接方法
-- example string operation
some_str, pos = ' some string', 1
-- default string syntax
while string.find(string.sub(some_str, pos, pos), '%s') do pos = pos +1 end
-- the same with syntactic sugar
while some_str:sub(pos, pos):find('%s') do pos = pos +1 end
所以我试着用我自己的函数得到同样的行为。但这失败了。
我找到的唯一方法是使用一个附加参数来表示:返回对象本身或结果。
这里有一个简单的例子
calc = {
result = 0,
operator = '',
run = function(self, a, b, r) -- return self with r='s'
if b == 's' then r, b = b, nil end
if not b then b, a = a, self.result end
if self.operator == '+' then self.result = (a) + (b)
elseif self.operator == '-' then self.result = (a) - (b)
elseif self.operator == '*' then self.result = (a) * (b)
elseif self.operator == '/' then self.result = (a) / (b) end
if r ~= nil then return self else return self.result end
end,
add = function(self, a, b, r) self.operator = '+' return self:run(a, b, r) end,
sub = function(self, a, b, r) self.operator = '-' return self:run(a, b, r) end,
mul = function(self, a, b, r) self.operator = '*' return self:run(a, b, r) end,
div = function(self, a, b, r) self.operator = '/' return self:run(a, b, r) end
}
-- single operation
result = calc:add(12, 5)
-- concatenated operations
result = calc:add(12, 5, 's'):sub(3, 's'):mul(2, 's'):div(7)
是否存在类似于字符串操作的方法?
提前感谢。您随后的呼叫将
's'
分配给b
参数,而不是r
。当然,检查返回self
失败。与其给带有一些标志的方法赋予不同的行为,不如让它们总是返回self
,并创建一个单独的方法来返回当前结果,这样读和编程会更干净
之后,您的呼叫将显示为:
result = calc:new(12):add(5):sub(3):mul(2):div(7):result()
此外,您并不需要将代理函数放入一个大函数中,这个大函数可以拆分为(如果
s),只需在add
/sub
/mul
/div
内部执行所有操作即可
您可能还需要多个calc对象,每个对象都有自己单独的当前结果。将常用函数存储在元表中,并使:new
使用此元表创建新实例,并为结果创建单独的条目
local calc_meta = { __index = {
add = function(self, number) self._r = self._r + number return self end,
sub = function(self, number) self._r = self._r - number return self end,
mul = function(self, number) self._r = self._r * number return self end,
div = function(self, number) self._r = self._r / number return self end,
result = function(self) return self._r end
}}
local calc = {
new = function(self, number)
return setmetatable({
_r = number or 0
}, calc_meta) end
}
result = calc:new(12):add(5):sub(3):mul(2):div(7):result()
print(result)
-- 4
不能用字符串完全复制Lua的行为-它内置于VM中,用于将
string
表视为字符串值的元表,并且在不修改VM本身的情况下无法编程。如果将\uuu add
/\uu sub
和其他数值方法添加到元表中,则可以在最后去掉额外的结果
,这样它们会自动将对象“展开”为基本数值。当然,在此之后,您将无法将方法应用于“unwrapped”值。>您随后的调用将“s”分配给b参数,而不是r<我知道,因为我检查给定的参数b是否为“s”,并将其与r交换。但这只是一个例子。你是对的,它可以用单独的方法来解决返回结果。但我感兴趣的是:如何在字符串库中解决它?结果与对象本身相同。您可以覆盖任何字符串,并将其用作字符串方法的对象。它是graetfull,但它是如何工作的?@McBarby,它是Lua VM内置的,你不能完全复制它。Lua返回一个新字符串,然后您可以简单地调用新字符串的方法。这就是锁链。返回的表是否与调用该方法的表相同?