Подтвердить что ты не робот

Создание функции с переменным числом аргументов или параметров в 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');

Однако, в дроте, этот код не будет работать. Есть ли способ сделать то же самое в дротике? Если нет, это что-то, что находится в дорожной карте?

4b9b3361

Ответ 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, но я не вижу запроса функции для этого. Вы, безусловно, можете его создать!