首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQF中模拟哈希表?

如何在SQF中模拟哈希表?
EN

Stack Overflow用户
提问于 2017-04-03 16:04:12
回答 3查看 657关注 0票数 4

SQF是一种编程语言。电脑游戏系列Arma。

SQF 已记录在案和列表的主要数据类型不包括哈希表(或字典)。

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

代码语言:javascript
复制
logic1 setVariable ["variable1", 1];
_a = logic1 getVariable "variable1";

但是,这需要一个与其关联的额外数组来跟踪已使用的键列表。

代码语言:javascript
复制
logic1Vars = [];
logic1 setVariable ["variable1", 1];
logic1Vars pushBack "variable1";

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

(或者是否有方法获取变量列表?)

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-03 18:37:44

可以使用allVariables检索名称空间中的键数。

要创建名称空间,可以使用逻辑、位置或SimpleObject。看看CBA是如何做它的,createNamespace.sqf

通常,位置或SimpleObject比使用GameLogic更具有性能友好性。你应该记住这一点。

但是您可能要搜索的是allVariables命令,它返回名称空间(Hashtable)中的所有变量。

还可以使用getVariable ARRAY设置默认值,以防名称空间不包含要读取的键。

CBA也有Hashes,它们的行为就像地图。不像hashTable (键没有散列),它也是SQF代码,而不是引擎代码,所以速度稍微慢一些。

此外(没有足够的声誉来评论)您不需要所有这些:

代码语言:javascript
复制
_vars = _logic getVariable "_VARIABLES";
_vars pushBack "variable1";
_logic setVariable ["_VARIABLES", _vars];

_vars将是对数组的引用,pushBack将向您所引用的数组中添加一个元素。所以pushBack已经在修改_VARIABLES了。不需要再设置一次。

票数 3
EN

Stack Overflow用户

发布于 2021-04-25 16:06:58

虽然这是一个老问题,但我想列出一个新的答案,您现在可以本机使用SQF中的HashMap命令创建一个ARMA3Version2.01之后的createHashMap

票数 2
EN

Stack Overflow用户

发布于 2017-04-03 16:19:44

创建哈希表而不必在mission.sqm中创建它的一种方法是创建它的脚本。具体来说,可以编写

代码语言:javascript
复制
allHashes = createGroup west;  // somewhere once; `west` or `east` does not matter here.

_logic = allHashes createUnit ["LOGIC", [0,0,0], [], 0, "NONE"];
_logicVars = [];

这仍然需要变量列表,因此不会将整个哈希表封装在一个对象中。在单个对象中实现哈希表逻辑的一种方法是使用

代码语言:javascript
复制
_logic = allHashes createUnit ["LOGIC", [0,0,0], [], 0, "NONE"];
_logic setVariable ["_VARIABLES", []];

并使用

代码语言:javascript
复制
_logic setVariable ["variable1", 1];
_vars = _logic getVariable "_VARIABLES";
_vars pushBack "variable1";
_logic setVariable ["_VARIABLES", _vars];

它可以封装在一个函数中,但仍然需要4行代码才能得到整个过程.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43189323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档