gpt4 book ai didi

collections - Ceylon 中 List、Tuple、Sequence、Sequential、Iterable、Array 等的区别

转载 作者:行者123 更新时间:2023-12-04 03:29:32 30 4
gpt4 key购买 nike

Ceylon 对可能都被视为某种数组的事物有几个不同的概念:List , Tuple , Sequence , Sequential , Iterable , Array , Collection , Category等。这些类型有什么不同,我应该什么时候使用它们?

最佳答案

drhagen 已经很好地回答了你的问题的第一部分,所以我将在第二部分说一点:你什么时候使用哪种类型?

一般情况下:编写函数时,使其接受支持所需操作的最通用类型。 到目前为止,如此明显。

Category 非常抽象,很少有用。

Iterable 如果你期望一些你将要迭代的元素流(或使用流操作,如 filtermap 等),则应该使用它。

关于 Iterable 的另一件事要考虑是它在命名参数中有一些额外的语法糖:

void printAll({Anything*} things, String prefix = "") {
for (thing in things) {
print(prefix + (thing?.string else "<null>"));
}
}

printAll { "a", "b", "c" };
printAll { prefix = "X"; "a", "b", "c" };

Try online
Iterable 类型的任何参数可以在命名参数列表的末尾以逗号分隔的参数列表的形式提供。那是,
printAll { "a", "b", "c" };

相当于
printAll { things = { "a", "b", "c" }; };

这允许您制作 DSL 样式的表达式; tour有一些很好的例子。

Collection 是,如 Correspondence ,相当抽象,以我的经验很少直接使用。

List 听起来应该是一个经常使用的类型,但实际上我不记得经常使用它。我不确定为什么。我似乎跳过它并将我的参数声明为 IterableSequential .

SequentialSequence 当你想要一个不可变的、固定长度的列表时。它也有一些语法糖:像 void foo(String* bar) 这样的可变参数方法。是 Sequential 的快捷方式或 Sequence范围。 Sequential还允许您使用 nonempty运算符,通常与 first 结合使用效果很好和 rest :
String commaSeparated(String[] strings) {
if (nonempty strings) {
value sb = StringBuilder();
sb.append(strings.first); // known to exist
for (string in strings.rest) { // skip the first one
sb.append(", ").append(string);
// we don’t need a separate boolean to track if we need the comma or not :)
}
return sb.string;
} else {
return "";
}
}

Try online

我一般用 SequentialSequence当我要对流进行多次迭代时(对于通用 Iterable 来说这可能很昂贵),尽管 List可能是更好的界面。

Tuple 永远不要用作 Tuple (除了在极少数情况下您对它们进行抽象),但使用 [X, Y, Z]语法糖通常很有用。您通常可以优化 Sequential成为 Tuple 的成员在一个子类中,例如。 G。父类(super class)有 <String|Integer>[] elements在一个子类中已知为 [String, Integer] elements .

Array 我从来没有用作参数类型,只是很少用作类来实例化和使用。

关于collections - Ceylon 中 List、Tuple、Sequence、Sequential、Iterable、Array 等的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35101387/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com