如何以优雅的方式按照锡兰的类型进行过滤?

Ren*_*ato 2 ceylon

我希望以下内容能够奏效:

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

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

takeOnlyStrings(for (item in ab) if (item is String) item);
Run Code Online (Sandbox Code Playgroud)

甚至这个:

Boolean isString(Object o) => (o is String);
takeOnlyStrings(ab.filter(isString));
Run Code Online (Sandbox Code Playgroud)

但没有运气.

Gav*_*ing 5

缩小值类型的语法是prefix is Type val,例如:

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

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

takeOnlyStrings(for (item in ab) if (is String item) item);
Run Code Online (Sandbox Code Playgroud)

语法item is String只是一个生成Boolean值的运算符表达式.它并没有缩小其论证的类型.


Gav*_*ing 5

这是第二种可能性:在Ceylon 1.2中,Iterable.narrow()可以使用新方法:

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

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

takeOnlyStrings(*ab.narrow<String>());
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!