由于您仅给出了您想要做的事情的粗略示例,而不是您的实际用例,因此提出替代方案有点困难。首先,对我来说这就是你想要的
local x;
function foo() x=x+1 end
function dostuff(a)
x = a;
foo();
return x;
end
我的问题是这foo
太简单了,绝对没有理由不让它成为一个接受值x
并返回的函数x+1
。此外,虽然 x 的必要初始化步骤并不是很糟糕,并且不会立即导致任何错误,但当您必须记住为另一个函数初始化变量时,它会使开发有点奇怪,如果您不这样做,可能会造成调试地狱不。
因此,由于 Lua 还支持多个返回值,因此上面的代码实际上是一个坏主意,它不会给您带来任何好处,例如:
function foo(a,b,c) return a,b,c end
function dostuff()
a,b,c = foo(a,b,c);
end
既然你写了关于代码重用的文章,这里是一个一般性的......推动你可以做的其他事情,那就是使用闭包。
你可以改变你的结构,不把 foox
作为参数,而是把dostuff
takefoo
作为参数:
function dostuff(foo)
return foo()
end
dostuff(function() return 1 end)
dostuff(function() return 2 end)
更进一步,您将了解一种称为部分应用的技术。
function dostuff(foo)
return function(x)
return foo(x);
end
end
dostuff(function(x) return x+1 end)(17)
local f = dostuff(function(x) return x+1 end)
f(17)f(18)f(19) -- ...
现在这意味着您不仅可以从外部修改函数在内部的工作方式,还可以保存该状态。作为额外的好处,您还可以将昂贵的操作(每个“实例”只需执行一次)放在外部函数中并节省一些性能。
我希望这些想法足以帮助您解决代码重用问题;)