2017-04-03 46 views
3

FYI:SQF is a programming language爲電腦遊戲系列阿瑪。如何在SQF中模擬哈希表?

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

您可以使用allVariables來檢索命名空間中的鍵數。

要創建名稱空間,您可以使用邏輯或位置或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將是陣列並推回參考將一個元素添加到該數組你指的是。所以pushBack已經在修改_VARIABLES。無需重新設置。

+0

'allVariables' returns lower-下載變量名稱。我認爲密鑰是不區分大小寫的,對嗎?最後,你可以使用SimpleObject來提供一個最簡單的代碼示例嗎? – Golias

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行的代碼以獲得整個東西...

+0

我不會抱怨4行代碼,C中的完整哈希實現可能是100倍的數量(並且在重新哈希,加載因子處理等方面效率很高)。 –