Написание функции sortBy для Dart - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь написать служебную функцию, которая сортирует список по заданному свойству:

List<T> sortBy<T, U extends Comparable<U>>(List<T> items, U Function(T item) f) =>
    items.toList()..sort((item1, item2) => f(item1).compareTo(f(item2)));

Я столкнулся с проблемой, когда свойство имеет тип int, например

sortBy<String, int>(['apple', 'ball', 'cow'], (word) => word.length);

Я получаю ошибку компиляции:

error: 'int' doesn't extend 'Comparable<int>'.

Почему int не Comparable? Есть ли другой способ написать sortBy, чтобы он работал как на int, так и на Comparable?

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Скоро Dart будет поддерживать статические методы расширения.
С этой функцией вы можете использовать некоторые готовые расширения.

Пример:

import 'package:enumerable/enumerable.dart';

void main(List<String> args) {
  final sorded = ['apple', 'ball', 'cow'].orderBy((e) => e.length);
  print(sorded);
}

Результат:

(cow, ball, apple)

2 голосов
/ 16 октября 2019

int реализует Comparable, но реализует Comparable<num>, что является вашей проблемой, так как вы хотите проверить на Comparable<int>. Не могли бы вы просто определить sortBy следующим образом?

List<T> sortBy<T, U extends Comparable>(List<T> items, U Function(T item) f) =>
    items.toList()..sort((item1, item2) => f(item1).compareTo(f(item2)));

Кажется, это работает, так как теперь мы просто хотим убедиться, что U расширяет Comparable.

...