Scala 为什么有些集合类有一个;“空的”;类方法之外的实例方法?
两者都存在,例如:Scala 为什么有些集合类有一个;“空的”;类方法之外的实例方法?,scala,collections,methods,language-design,Scala,Collections,Methods,Language Design,两者都存在,例如: Map.empty[Int, Int] Map(1 -> 41).empty Set().empty Set.empty 但这里只存在类方法: List.empty //OK List(1,2,3).empty //Doesn't exist Array.empty //OK Array("a").empty //Doesn't exist 对于类方法来说,empty不是一个完美的例子吗(因此实例方法empty不应该被弃用吗) 或者应
Map.empty[Int, Int]
Map(1 -> 41).empty
Set().empty
Set.empty
但这里只存在类方法:
List.empty //OK
List(1,2,3).empty //Doesn't exist
Array.empty //OK
Array("a").empty //Doesn't exist
对于类方法来说,empty
不是一个完美的例子吗(因此实例方法empty
不应该被弃用吗)
或者应该将一个empty
实例方法添加到缺少它的类中吗
从语言的角度来看,是否有任何东西使得仅将空
作为类方法变得困难(例如类型推断、高级类型等)
附言:
有人建议,如果没有实例方法empty
,则很难实现具有默认值的映射:
Map[Int, Int](1->2, 21->42).withDefault(_*2).empty
你觉得怎么样?只有不可变的列表。EmptyList只有一个实例,因此类级别的empty没有意义 映射特性可以通过可变项实现,因此需要多个实例
。。。我认为这个解释缺少了一些东西,但可能这只是一个开始。没错,
empty
可能是类实例上的一个方法。集合和映射之所以需要它,是因为它们使用这种方法实现它们的构建器。我想它没有被包括在其他地方的一个原因是因为它不是一个典型的用例。我想知道为什么Map
有空的,而不是相反。毕竟,这不是你对某件事做的操作,它只是某件事的一个实例
无论如何:
(List(1, 2, 3): Traversable[Int]).companion.empty
我把Traversable
放在那里,只是为了显示它对任何集合都有效。我猜实例上的empty
方法是前canBuildFrom时代的产物。为什么它没有意义?不要求List.empty
返回新实例。为什么不能从List.empty返回Nil
?