簡體   English   中英

在Scala集中覆蓋toString

[英]Override toString in a Scala set

我想創建一組名為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> 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM