如何在SQF中模拟哈希表?

时间:2017-04-03 16:04:12

标签: sqf

仅供参考:电脑游戏系列Arma的SQF is a programming language

SQF are documented的主要数据类型和列表不包含哈希表(或字典)。

拥有哈希表的一种方法是在mission.sqm中创建游戏逻辑(例如,命名为logic1),并在其上使用setVariablegetVariable,例如

logic1 setVariable ["variable1", 1];
_a = logic1 getVariable "variable1";

但是,这需要一个与之关联的额外数组来跟踪使用过的密钥列表,例如

logic1Vars = [];
logic1 setVariable ["variable1", 1];
logic1Vars pushBack "variable1";

logic1 setVariable ["variable1", nil];
logic1Vars = logic1Vars - ["variable1"];

(或者有办法获取变量列表吗?)

另一种方式(可能但我还没试过)是实现哈希表。这显然需要额外的努力,因为实现一个好的表并不容易。

但也许我错过了一些东西:是否有一种在SQF中拥有哈希表的惯用方法?

3 个答案:

答案 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