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
Lua 如何保存布尔条件并在以后进行计算_Lua_Lua Table_Meta Method - Fatal编程技术网

Lua 如何保存布尔条件并在以后进行计算

Lua 如何保存布尔条件并在以后进行计算,lua,lua-table,meta-method,Lua,Lua Table,Meta Method,我需要创建一个结构。结构必须包含一个“布尔条件”数组。大概是这样的: function ReturnStructure () local structure = { {A < 10}, {B == "smth"}, {FunctionReturnsTrueOrFalse(params)}, --... } return structure end structure = ReturnStru

我需要创建一个结构。结构必须包含一个“布尔条件”数组。大概是这样的:

function ReturnStructure ()
    local structure = { 
        {A < 10},
        {B == "smth"},
        {FunctionReturnsTrueOrFalse(params)},
        --... 
    }   
    return structure
end

structure = ReturnStructure()

print(structure[1][1]) -- prints true or false depending on the value of A
函数返回结构()
局部结构={
{A<10},
{B==“smth”},
{FunctionReturnsTrueOrFalse(params)},
--... 
}   
返回结构
结束
结构=返回结构()
打印(结构[1][1])——根据
事实上,这些表包含true或false,而不是条件,因为当我们调用函数ReturnStructure并创建本地表结构时,字段中的所有条件都将被执行。我想创建一个结构,其字段将不包含布尔值,而是可以执行(当我想执行时)并获取布尔值的内容。我可以通过使用匿名函数来实现这一点:

function ReturnStructure ()
    local structure = { 
        {function() return A < 10 end},
        {function() return B == "smth" end},
        {FunctionReturnsTrueOrFalse, params}, -- I don't call function in this line, a just put its adress and parameters to table.
        --... 
    }   
    return structure
end

structure = ReturnStructure()

print(structure[1][1]) -- prints function: 0x109bdd0
print(structure[1][1]()) -- prints true or false. I execute condition in this string.
函数返回结构()
局部结构={
{function()返回一个<10 end},
{function()返回B==“smth”end},
{FunctionReturnsTrueOrFalse,params},--我没有在这一行调用函数,a只是将其地址和参数放入表中。
--... 
}   
返回结构
结束
结构=返回结构()
打印(结构[1][1])--打印函数:0x109bdd0
打印(结构[1][1]())--打印正确或错误。我在这个字符串中执行条件。
所以,有一个代码,我希望它的工作,但它似乎非常丑陋。 我想听听如何创建一个更简单、更漂亮的表,而不必在每个字段中打印
function()return…
。我认为我应该使用一个简单的OOP实现来创建作为对象的结构,但我不知道如何做到这一点。我也很乐意得到一些方法、实现、文章等的参考资料,这些资料可以帮助我找到一些想法

函数返回结构()
function ReturnStructure ()
   local structure = {
     {'A < 10'},
     {'B == "smth"'},
     {FunctionReturnsTrueOrFalse, 'parameter'},
   }
   local function call_me(f, ...)
      return (type(f)=='function' and f or 
         assert((load or loadstring)('return '..f)))(...)
   end
   return setmetatable({}, {
      __index =
         function(t,k)
            if structure[k] then
               return call_me((table.unpack or unpack)(structure[k]))
            end
         end,
      __newindex = function(t,k,v) structure[k] = v end
   })
end

A = 2
B = "anything"
function FunctionReturnsTrueOrFalse(par)
   return #par > 5
end

structure = ReturnStructure()

print(structure[1])  -- true
print(structure[2])  -- false
print(structure[3])  -- true
structure[4] = {'1==0'}
print(structure[4])  -- false
局部结构={ {'A<10'}, {'B==“smth”}, {FunctionReturnsTrueOrFalse,'parameter'}, } 局部函数调用(f,…) 返回(类型(f)=“函数”和f或 断言((加载或加载字符串)('return'..f)))(…) 结束 返回setmetatable({}{ __索引= 函数(t,k) 如果结构[k]那么 return call_me((table.unpack或unpack)(结构[k])) 结束 完,, __newindex=函数(t,k,v)结构[k]=v端 }) 结束 A=2 B=“任何东西” 函数返回结构或参数(par) 返回#par>5 结束 结构=返回结构() 打印(结构[1])--true 打印(结构[2])——错误 打印(结构[3])——正确 结构[4]={'1==0'} 打印(结构[4])——错误
我想听听关于如何在不打印函数()返回的情况下创建一个更简单、更漂亮的表的一些想法。。。在各个领域

没有。如果Lua有C#的lambda语法,您可以编写:

local structure = { 
    () => A < 10,
    () => B == "smth",
    () => FunctionReturnsTrueOrFalse(params),
这也意味着你不需要把它们放在表格中。每个函数都只是一个您调用的函数,这也简化了调用代码

如果您真的想在编译时计算
函数returnstrueorfalse
的参数,我将编写一个实用程序例程,从函数及其参数构建闭包:

local function bind(f, ...)
    local args = {...}
    return function() f(unpack(args)) end
end
然后使用它将函数绑定到其参数:

local structure = { 
    function() return A < 10 end,
    function() return B == "smth" end,
    bind(FunctionReturnsTrueOrFalse, param1, param2, param3),
local结构={
函数()返回一个<10结束,
函数()返回B==“smth”结束,
绑定(函数returnstrueorfalse、param1、param2、param3),
那么,您表中的所有内容都只是一个函数,因此您不需要特殊处理

您拥有的是Lua中最“漂亮”的功能,部分原因是Lua没有(让许多人非常懊恼)lambdas的缩写语法,因此您必须使用各种技巧,这些技巧将极大地混淆代码的意图。您所拥有的内容清晰而简单,任何阅读它的人都可以立即看到代码在做什么。请注意,对于示例中的第三项,为了保持一致性,最好创建一个闭包
{function()返回函数rtof(arg1,arg2)end}
(其中
arg1
等可能来自
ReturnStructure()
参数、全局变量等)。
local function bind(f, ...)
    local args = {...}
    return function() f(unpack(args)) end
end
local structure = { 
    function() return A < 10 end,
    function() return B == "smth" end,
    bind(FunctionReturnsTrueOrFalse, param1, param2, param3),