Создание функции с переменным числом аргументов или параметров в Dart
Я ищу способ создания функции с переменным числом аргументов или параметров в Dart. Я знаю, что вместо этого могу создать параметр массива, но я бы предпочел не делать этого, потому что я работаю над библиотекой, где важна синтаксическая краткость.
Например, в простом JavaScript мы могли бы сделать что-то вроде этого (заимствованный из здесь):
function superHeroes() {
for (var i = 0; i < arguments.length; i++) {
console.log("There no stopping " + arguments[i]);
}
}
superHeroes('UberMan', 'Exceptional Woman', 'The Hunk');
Однако, в дроте, этот код не будет работать. Есть ли способ сделать то же самое в дротике? Если нет, это что-то, что находится в дорожной карте?
Ответы
Ответ 1
Вы не можете этого сделать сейчас.
Я действительно не знаю, вернутся ли varargs - они были там несколько раз назад, но были удалены.
Однако можно эмулировать varargs с Emulating functions. См. Ниже фрагмент кода.
typedef dynamic OnCall(List);
class VarargsFunction extends Function {
OnCall _onCall;
VarargsFunction(this._onCall);
call() => _onCall([]);
noSuchMethod(Invocation invocation) {
final arguments = invocation.positionalArguments;
return _onCall(arguments);
}
}
main() {
final superHeroes = new VarargsFunction((arguments) {
for (final superHero in arguments) {
print("There no stopping ${superHero}");
}
});
superHeroes('UberMan', 'Exceptional Woman', 'The Hunk');
}
Ответ 2
Я немного поигрался с ответом Александра Ардуина и обнаружил, что мы можем настроить пару вещей, чтобы сделать эту работу в текущей версии Dart:
class VarArgsClass {
noSuchMethod(InvocationMirror invocation) {
if (invocation.memberName == 'superheroes') {
this.superheroes(invocation.positionalArguments);
}
}
void superheroes(List<String> heroNames) {
for (final superHero in heroNames) {
print("There no stopping ${superHero}!");
}
}
}
main() {
new VarArgsClass().superheroes('UberMan', 'Exceptional Woman', 'The Hunk');
}
Это имеет много проблем, в том числе:
- Предупреждение генерируется везде, где вы вызываете
superheroes()
потому что подпись не соответствует вашим параметрам. - Требуется дополнительная ручная проверка, чтобы убедиться, что список аргументов, передаваемых супергероям, действительно является
List<String>
. - Необходимость проверки имени члена в
noSuchMethod()
повышает вероятность того, что вы забудете изменить строку 'superheroes', если вы измените имя метода. - Отражение затрудняет отслеживание пути к коду.
НО, если вы в порядке со всеми этими проблемами, то это сделает работу.
Ответ 3
Если вы действительно используете синтаксическую краткость, просто объявите функцию/метод, указав 10 необязательных позиционных параметров и сделайте это. Вероятно, кто-то вызовет это с более чем 10 аргументами.
Если это звучит как хак, это потому, что это взломать. Но я видел, как команда Дарт делает то же самое: -)
Ответ 4
В примере, который вы написали, я думаю, что вам лучше использовать список. Извините за это!
Я смотрю на dartbug.com, но я не вижу запроса функции для этого. Вы, безусловно, можете его создать!