Как отфильтровать по типу в Цейлоне элегантным способом?

Я надеялся, что будет работать следующее:

void takeOnlyStrings(String* s) {
   print(s);
}

{String|Integer*} ab = {"Hi", 1};

takeOnlyStrings(for (item in ab) if (item is String) item);

Или даже это:

Boolean isString(Object o) => (o is String);
takeOnlyStrings(ab.filter(isString));

Но не повезло.

2 ответа

Решение

Синтаксис для сужения типа значения - префикс is Type val, например:

void takeOnlyStrings(String* s) {
    print(s);
}

{String|Integer*} ab = {"Hi", 1};

takeOnlyStrings(for (item in ab) if (is String item) item);

Синтаксис item is String это просто выражение оператора, которое производит Boolean значение. Это не сужает тип своего аргумента.

Вот вторая возможность: в Цейлоне 1.2 новый метод Iterable.narrow() может быть использован:

void takeOnlyStrings(String* s) {
    print(s);
}

{String|Integer*} ab = {"Hi", 1};

takeOnlyStrings(*ab.narrow<String>());

Надеюсь, это поможет!

Другие вопросы по тегам