Haxe - переменное количество аргументов в SWC

Я переношу библиотеку из AS3 в Haxe, и мне нужно сделать метод, принимающий переменное количество аргументов. Target - это *.swc-библиотека.

Мой вопрос относится к этому, но ни одно из предлагаемых решений не выводит метод с необходимой сигнатурой: someMethod(...params)

Вместо этого, полученный метод: someMethod(params:*=null)

Это не будет скомпилировано в проектах AS3 с использованием библиотеки, а использованный код недоступен. Есть ли способ сделать это, возможно, макросы?

1 ответ

Ну, это отличный вопрос. И, оказывается, есть способ сделать это!

В принципе, __arguments__ является специальным идентификатором цели Flash, в основном используемым для доступа к специальным arguments локальной переменной. Но он также может использоваться в сигнатуре метода, и в этом случае он изменяет результат test(args: *) для test(...__arguments__).

Быстрый пример (live on Try Haxe):

class Test {
 static function test(__arguments__:Array<int>)
 {
 return 'arguments were: ${__arguments__.join(", ")}';
 }
 static function main():Void
 {
 // the haxe typed way
 trace(test([1]));
 trace(test([1,2]));
 trace(test([1,2,3]));

 // using varargs within haxe code as well
 // actually, just 'var testm:Dynamic = test' would have worked, but let not add more hacks here
 var testm = Reflect.makeVarArgs(cast test); // cast needed because Array<int> != Array<dynamic>
 trace(testm([1]));
 trace(testm([1,2]));
 trace(testm([1,2,3]));
 }
}
</dynamic></int></int>

Самое главное, это генерирует следующее:

static protected function test(...__arguments__) : String {
 return "arguments were: " + __arguments__.join(", ");
}

licensed under cc by-sa 3.0 with attribution.