Как отфильтровать по типу в Цейлоне элегантным способом?
Я надеялся, что будет работать следующее:
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>());
Надеюсь, это поможет!