【问题标题】:Override toString in a Scala set覆盖 Scala 集中的 toString
【发布时间】:2013-03-09 04:38:25
【问题描述】:

我想创建一组名为IntSet 的整数。 IntSet 在各方面都与Set[Int] 相同,只是它的toString 函数将元素打印为逗号分隔(与您调用mkString(",") 相同),并且它有一个构造函数,它采用Traversable整数。最简单的方法是什么?

> IntSet((1 to 3)).toString
1,2,3

我认为会有一些单行方式来做到这一点,但我一直在摆弄隐式函数并扩展 HashSet,但我无法弄清楚。


诀窍是使用代理对象。 Eastsun 的答案如下。这是一个稍微不同的版本,它定义了一个名为 IntSet 的类型并使其不可变。

import collection.immutable.{HashSet, SetProxy}

class IntSet(values: Traversable[Int]) extends SetProxy[Int] {
  override val self: Set[Int] = HashSet(values.toSeq:_*)
  override def toString() = mkString(",")
}

【问题讨论】:

    标签: scala tostring scala-collections


    【解决方案1】:
    scala> import scala.collection.mutable
    import scala.collection.mutable
    
    scala> def IntSet(c: Traversable[Int]): mutable.Set[Int] = new mutable.SetProxy[Int] {
         |   override val self: mutable.Set[Int] = mutable.HashSet(c.toSeq :_*)
         |   override def toString = mkString(",")
         | }
    IntSet: (c: Traversable[Int])scala.collection.mutable.Set[Int]
    
    scala> IntSet(1 to 3)
    res0: scala.collection.mutable.Set[Int] = 1,2,3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多