Scala集合有一堆可读且几乎可读的运算符,如:+
和+:
,但为什么没有像append
这样的人类可读的同义词?
答案 0 :(得分:9)
Scala中的所有可变集合都有BufferLike trait,并且它定义了追加方法。
不可变集合没有 BufferLike特性,因此只定义其他方法,这些方法不会更改集合,但会生成新集合。
答案 1 :(得分:4)
符号方法名称允许与赋值操作=
组合。
例如,如果您有一个创建新集合的方法++
,您可以自动使用++=
将新集合分配给某个变量:
var array = Array(1,2,3)
array ++= Array(4,5,6)
// array is now Array(1,2,3,4,5,6)
如果没有符号方法名称,这是不可能的。
答案 2 :(得分:3)
事实上,它们通常是一些人类可读的同义词:
foldLeft
相当于/:
foldRight
相当于:\
其余的是加法运算符,它们具有很强的可读性:
++
相当于java addAll
:+
追加+:
是前置分号的位置表示接收器实例。
最后,一些奇怪的运算符是其他函数式编程语言的遗留物。如列表构造(SML)或演员消息(erlang)。
答案 3 :(得分:2)
它与其他语言有什么不同吗?
让我们来看看Java。 +
上-
,*
,/
和int
的人类可读版本是什么?或者,我们来看String
:+
的人类可读版本是什么?请注意,concat
不是一回事 - 它不接受非String
参数。
也许你对它感到困扰,因为在Java中 - 与C ++不同 - 要么只使用非字母运算符,要么使用字母运算符 - String
的{{1}}除外}。
答案 4 :(得分:0)
Scala标准库并不适合Java友好。相反,提供适配器以在Java和Scala集合之间进行转换。
尝试提供Java友好API不仅会限制标识符的选择(或者要求提供别名),还会限制使用泛型和函数类型的方式。验证设计需要更多的测试。
关于同一主题,我记得关于2.8集合是否应该实现java.util.Iterable
的一些争论。