2008-09-09 55 views
15

我在ActionScript中最缺乏的一件事是缺少運算符重載,特別是==。我在這個問題上加了一個「Compare」方法來解決這個問題,但是在許多情況下這並沒有什麼幫助,比如當你想使用內置的Dictionary時。ActionScript 3.0中缺少運算符重載

是否有解決此問題的好方法?

回答

12

沒有。

但是,將equals方法添加到您自己的類中並沒有什麼壞處。在比較對象時,我嘗試不使用==(對於===也是如此),因爲它只檢查標識

不幸的是,Flash和Flex中的所有集合都假定身份是唯一需要的平等度量。

有提示Flex中,有人希望在同一時間,以緩解這個問題,但現在看來似乎被拋棄了:有一個叫IUID一個接口,它是在的Flex開發人員指南中提到,但它是不在任何地方使用即使Flex中的集合用它來確定平等。而且,由於您正在尋求Flash的解決方案,因此它可能無法幫助您。

我已經在我的博客上寫了更多關於這個(在Flex的上下文中):Is there no equality?

+0

這不是問題。低級集合應該使用實例平等。任何其他類型的相等性檢查都是完全隨意的,應該在等號方法中明確定義。當你編碼的時候,你想要實例相等還是任意的數據相等性檢查應該是非常明顯的。一般來說,唯一需要進行數據相等性檢查(檢查特定對象關鍵字)的時間是處理遠程數據對象或可由特定關鍵碼識別的數據庫記錄。集合中沒有通用的實現,因爲它實現起來微不足道。 – Triynko 2014-05-13 21:19:18

+0

我剛剛在一個DataUtils類中創建了一個輔助方法集合,其方法簽名就像`indexOfValue(collection:*,v​​alue:*,match_field_or_function:*):int;`該方法可以簡單地迭代集合並提取特定字段從每個對象與* value *進行比較,或者可以通過函數運行每個對象,其結果與* value *進行比較。 * match_field_or_function *參數甚至可處理多個部分字段名稱,用於在列表項的集合上進行深入研究,例如「data.id」,每個列表項都具有一個data屬性,用於存儲具有id字段的任何種類的對象。 – Triynko 2014-05-13 21:32:32

4

是的,它可以做(但要注意,它的哈克):http://filimanjaro.com/2012/operators-overloading-in-as3-javascript-too-%E2%80%93-workaround/

在我寫+ =,教程 - =運算符重載。但是也可以使用==,如果不明確,我可以寫更多的關於這個的信息。

啊,這種方法有一些缺點(在極少數情況下甚至可能是危險的)。在生產中使用它之前要三思。

編輯:

測試後似乎伎倆與+ =, - =不適用==操作符(情理之中的事情)。對不起,誤導性的信息。