仅供参考:电脑游戏系列Arma的SQF is a programming language。
SQF are documented的主要数据类型和列表不包含哈希表(或字典)。
拥有哈希表的一种方法是在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中拥有哈希表的惯用方法?
答案 0 :(得分:3)
您可以使用allVariables检索命名空间中的键数。
要创建命名空间,您可以使用Logic或Location或SimpleObject。了解CBA如何做到https://github.com/CBATeam/CBA_A3/blob/master/addons/common/fnc_createNamespace.sqf。
通常,Location或SimpleObject比使用GameLogic更具性能。你应该牢记这一点。
但是您可能正在搜索的是allVariables命令,该命令返回命名空间(Hashtable)中的所有变量。
如果命名空间不包含您要阅读的密钥,也可以使用getVariable ARRAY
设置默认值。
CBA也有Hashes
,他们的行为就像一张地图。不像hashTable(键没有散列)也是SQF代码而不是引擎代码所以它稍慢。
另外(没有足够的声誉评论) 你不需要所有这些:
_vars = _logic getVariable "_VARIABLES";
_vars pushBack "variable1";
_logic setVariable ["_VARIABLES", _vars];
_vars将是对Array的引用,pushBack将向您引用的Array添加一个元素。所以pushBack已经在修改_VARIABLES
。无需重新设置。
答案 1 :(得分:0)
创建哈希表而不必在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行代码才能得到整个函数......
答案 2 :(得分:0)
虽然这是一个老问题,但我想列出一个新答案,您现在可以使用 HashMap in SQF 命令在 Arma 3 2.01 版本机创建一个 createHashMap
。