SQF是一种编程语言。电脑游戏系列Arma。
SQF 已记录在案和列表的主要数据类型不包括哈希表(或字典)。
拥有哈希表的一种方法是在mission.sqm中创建一个游戏逻辑(例如,命名为logic1),并在其上使用setVariable和getVariable。
logic1 setVariable ["variable1", 1];
_a = logic1 getVariable "variable1";但是,这需要一个与其关联的额外数组来跟踪已使用的键列表。
logic1Vars = [];
logic1 setVariable ["variable1", 1];
logic1Vars pushBack "variable1";
logic1 setVariable ["variable1", nil];
logic1Vars = logic1Vars - ["variable1"];(或者是否有方法获取变量列表?)
另一种方法(这是可能的,但我还没有尝试)是实现一个哈希表。这显然需要额外的努力,因为实现一个好的表并不容易。
但也许我遗漏了一些东西:在SQF中是否有一种惯用的方法来拥有哈希表?
发布于 2017-04-03 18:37:44
可以使用allVariables检索名称空间中的键数。
要创建名称空间,可以使用逻辑、位置或SimpleObject。看看CBA是如何做它的,createNamespace.sqf。
通常,位置或SimpleObject比使用GameLogic更具有性能友好性。你应该记住这一点。
但是您可能要搜索的是allVariables命令,它返回名称空间(Hashtable)中的所有变量。
还可以使用getVariable ARRAY设置默认值,以防名称空间不包含要读取的键。
CBA也有Hashes,它们的行为就像地图。不像hashTable (键没有散列),它也是SQF代码,而不是引擎代码,所以速度稍微慢一些。
此外(没有足够的声誉来评论)您不需要所有这些:
_vars = _logic getVariable "_VARIABLES";
_vars pushBack "variable1";
_logic setVariable ["_VARIABLES", _vars];_vars将是对数组的引用,pushBack将向您所引用的数组中添加一个元素。所以pushBack已经在修改_VARIABLES了。不需要再设置一次。
发布于 2021-04-25 16:06:58
虽然这是一个老问题,但我想列出一个新的答案,您现在可以本机使用SQF中的HashMap命令创建一个ARMA3Version2.01之后的createHashMap。
发布于 2017-04-03 16:19:44
创建哈希表而不必在mission.sqm中创建它的一种方法是创建它的脚本。具体来说,可以编写
allHashes = createGroup west; // somewhere once; `west` or `east` does not matter here.
_logic = allHashes createUnit ["LOGIC", [0,0,0], [], 0, "NONE"];
_logicVars = [];这仍然需要变量列表,因此不会将整个哈希表封装在一个对象中。在单个对象中实现哈希表逻辑的一种方法是使用
_logic = allHashes createUnit ["LOGIC", [0,0,0], [], 0, "NONE"];
_logic setVariable ["_VARIABLES", []];并使用
_logic setVariable ["variable1", 1];
_vars = _logic getVariable "_VARIABLES";
_vars pushBack "variable1";
_logic setVariable ["_VARIABLES", _vars];它可以封装在一个函数中,但仍然需要4行代码才能得到整个过程.
https://stackoverflow.com/questions/43189323
复制相似问题