【问题标题】:Why do some collection classes have an "empty" instance method additionally to the class method?为什么有些集合类除了类方法外还有一个“空”实例方法?
【发布时间】:2011-02-09 10:40:59
【问题描述】:

两者都存在例如这里:

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 作为类方法变得困难(例如类型推断、更高种类的类型......)。

PS: 有人建议,如果没有实例方法empty,使用默认值的 Map 将更难实现:

Map[Int, Int](1->2, 21->42).withDefault(_*2).empty

你怎么看?

【问题讨论】:

  • 我猜实例上的 empty 方法是来自 pre-canBuildFrom 时代的产物。

标签: scala collections methods language-design


【解决方案1】:

没错,empty 可以是类实例上的方法。集合和映射需要它的一个原因是因为它们使用这种方法实现了它们的构建器。我想它没有被包含在其他地方的一个原因是因为它不是一个典型的用例。

【讨论】:

    【解决方案2】:

    我想知道为什么Mapempty,而不是相反。毕竟,这不是你对某事进行的操作,它只是某事的一个实例。

    无论如何:

    (List(1, 2, 3): Traversable[Int]).companion.empty
    

    我在那里输入Traversable 只是为了展示此作品适用于任何收藏。

    【讨论】:

      【解决方案3】:

      只有不可变的列表。 EmptyList 只有一个实例,因此类级别的空没有意义。

      Map trait 可以由可变对象实现,因此您需要多个实例。

      ...我认为这个解释缺少一些东西,但也许这是一个开始。

      【讨论】:

      • 为什么没有意义? List.empty 不要求返回新实例。为什么不能从 List.empty 返回Nil
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多