Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Methods Lua:我如何连接方法,就像连接字符串方法一样?_Methods_Lua_Concatenation - Fatal编程技术网

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返回一个新字符串,然后您可以简单地调用新字符串的方法。这就是锁链。返回的表是否与调用该方法的表相同?