gpt4 book ai didi

lua - 如何保存 bool 条件并稍后评估

转载 作者:行者123 更新时间:2023-12-02 01:51:10 24 4
gpt4 key购买 nike

我需要创建一个结构。该结构必须包含一个“ bool 条件”数组。像这样的东西:

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

实际上这些表包含真假,而不是条件,因为当我们调用函数 ReturnStructure 并创建本地表结构时,字段中的所有条件都会被执行。我想创建一个结构,其字段将不包含 bool 值,而是我可以执行的东西(当我想做的时候)并获得一个 bool 值。我可以通过使用匿名函数来实现这一点:
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.

所以,有一个代码可以按我的意愿工作,但它看起来很丑陋。
我想听听一些关于如何在不打印的情况下创建更简单、更漂亮的 table 的想法 function () return ...在每个领域。我认为我应该使用简单的 OOP 实现将我的结构创建为对象,但我不知道该怎么做。我也很乐意得到一些方法、实现、文章等的引用,这可以帮助我找到一些想法。

最佳答案

I want to hear some ideas on how to create a simpler and more beautiful table, without printing function () return ... in every field.



没有。如果 Lua 有 C# 的 lambda 语法,你可以这样写:
local structure = { 
() => A < 10,
() => B == "smth",
() => FunctionReturnsTrueOrFalse(params),

但是 Lua 喜欢保持小而简单,以避免增加语言及其实现的大小和复杂性,因此我们为一种函数类型提供一种语法。

您可以将它们存储为字符串,然后编译并运行它们,但这是选择形式而不是功能。您不想不必要地调用编译器。
local structure = { 
'A < 10',
'B == "smth"',
'FunctionReturnsTrueOrFalse(params)',

所以你原来的解决方案更好。我不特别喜欢前两项推迟评估其参数的方式,而您的第三个示例在编译时评估参数。处理 FunctionReturnsTrueOrFalse 会更一致。相同
local structure = { 
function() return A < 10 end,
function() return B == "smth" end,
function() return FunctionReturnsTrueOrFalse(param1) end,

这也意味着您不需要将它们放在表格中。每个只是你调用的一个函数,这也简化了调用代码。

如果你真的想评估 FunctionReturnsTrueOrFalse的参数在编译时,我会编写一个实用程序来从一个函数及其参数构建一个闭包:
local function bind(f, ...)
local args = {...}
return function() f(unpack(args)) end
end

然后使用它将函数绑定(bind)到它的参数:
local structure = { 
function() return A < 10 end,
function() return B == "smth" end,
bind(FunctionReturnsTrueOrFalse, param1, param2, param3),

那么你表中的所有东西都只是一个函数,所以你不需要特殊处理

关于lua - 如何保存 bool 条件并稍后评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22601809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com