2014-12-21 1 views
0

Я пытаюсь создать haxe.ds.HashMap, где ключи являются объектом, который я не контролирую. Таким образом, они не реализуют метод hashCode, и я не могу их изменить.Использование тегов в качестве ключей HashMap в Haxe

Я бы очень хотел использовать реферат, чтобы выполнить это, но я получаю некоторые ошибки времени компиляции.

Here is the code Я играю с:

import haxe.ds.HashMap; 

abstract IntArrayKey(Array<Int>) from Array<Int> { 
    inline public function new(i: Array<Int>) { 
     this = i; 
    } 
    public function hashCode(): Int { 
     // General warning: Don't copy the following line. Seriously don't. 
     return this.length; 
    } 
} 

class Test { 
    static function main() { 
     var hash = new HashMap<IntArrayKey, Bool>(); 
    } 
} 

компиляция ошибки:

Test.hx:15: characters 19-51 : Constraint check failure for haxe.ds.HashMap.K 
Test.hx:15: characters 19-51 : IntArrayKey should be { hashCode : Void -> Int } 

Но в тот момент я change my abstract over to a class, он отлично компилируется:

import haxe.ds.HashMap; 

class IntArrayKey { 
    private var _i: Array<Int>; 
    inline public function new(i: Array<Int>) { 
     this._i = i; 
    } 
    public function hashCode(): Int { 
     // General warning: Don't copy the following line. Seriously don't. 
     return this._i.length; 
    } 
} 

class Test { 
    static function main() { 
     var hash = new HashMap<IntArrayKey, Bool>(); 
    } 
} 

Это точно тот же hashCode реализация, просто другой контекст. Есть ли способ сделать это? Или это ограничение языка?

ответ

2

Насколько я знаю, отвлекается в настоящее время не может удовлетворить требования типа, как это, цитата из кода: abstract HashMap<K:{ function hashCode():Int; }, V >(HashMapData<K,V>) {

Итак, я сомневаюсь, что вы могли бы сделать это в значительной степени.

Важным моментом будет то, что в то время как тезисы иногда могут предоставлять служебные свободной абстракции, который является весьма полезным для оптимизации, время, необходимое для создания экземпляра (вероятно, скрыты от глаз с abstract Name(Holder) to Holder имея @:fromArray<Int> и @:toArray<Int>) Держатель для массива, который будет требуемый метод не такой высокий (по сравнению с обычными накладными расходами во время выполнения), и если он не является действительно частым кодом, должен быть ваш первый способ.

Однако, сам код HashMap довольно короткий и простой: here. Вы можете просто скопировать его и заставить его работать с вашим примером. Возможно, вы даже можете создать более качественную, но универсальную версию, используя интерфейсы (хотя я не уверен, что абстрактные тексты могут реально их реализовать).

+0

Подтверждено людьми Haxe, что это по дизайну: https://github.com/HaxeFoundation/haxe/issues/3708 – Nycto