1

我宁愿只看到 Option 的值(如果它不是 None),而不是以下额外的 Some() 噪音:

List((Some(OP(_)),Some(share),3), (Some(OP(D)),Some(shaara),4), (Some(OP(I)),Some(shaaee),4))

现在,我可以为 List[Option[_]] 编写一个处理此问题的方法。但是还有许多其他结构中会出现 Options - 所以这种显式寻址每个结构的方法很麻烦。

由于隐含的优先级较低,以下代码将被忽略:

  implicit def toString(myopt : Option[_]) = if (myopt == None) "None" else myopt.get

令人担忧的是 - 尽管实现了例如以所需方式处理此问题的 toString(List[Option_]]) 方法,但这仍然是一次性的。怎么样一个

Map[Option,Option]  =>     def toString(Map[Option,Option]) = { .. }

看来我们仍然需要为每个集合类型实现一个显式的 toString() ..

4

3 回答 3

4

我猜你不能覆盖这种行为toString,但你可以使用shows(和show)方法scalaz。您可以覆盖这些方法的行为:

import scalaz._, Scalaz._
val l = List(1.some, none, 3.some, 4.some, none, 6.some)

l.shows
// res0: String = [Some(1),None,Some(3),Some(4),None,Some(6)]

implicit def optionShow[T: Show]: Show[Option[T]] =
  Show.show{ _.map{_.show}.getOrElse(Cord("<none>")) }

l.shows
// res1: String = [1,<none>,3,4,<none>,6]

它适用于所有类型Show

1.some.node(none.node(2.some.leaf)).drawTree
// 1
// |
// `- <none>
//    |
//    `- 2

Map(1.some -> 2.some, none[Int] -> 3.some).shows
// Map[1->2, <none>->3]
于 2013-12-14T18:36:50.003 回答
2

好吧,我只想写一个类似于您的隐式包装器。

class OW[T](val option : Option[T]) {
  override def toString = if (option.isEmpty) "None" else option.get.toString
}

然后,当我想要漂亮的 toString 时,我只需将任何集合映射到 OW 的实例。

println(List(Some(3), Some("Hello"), None).map(new OW(_)))

打印: List(3, Hello, None)

真的没有更好的方法。

于 2013-12-14T18:58:14.413 回答
0

以下处理想到的情况:

  def show(obj: Any) : String = {
    obj match {
      case o: Option[_] =>
        if (o == None) {
          "<none>"
        } else {
          show(o.get)
        }
      case i: Iterable[_] =>
        i.map(show).mkString("[", ",", "]")
      case m: Map[_, _] =>
        m.map {
          case (a, b) => List(show(a), show(b)).mkString(":")
        }.mkString("{", ",", "}")
      case e: Enumeration =>
        e.toString
      case c : Product if !c.getClass.getMethods.map(_.getName).contains("copy$default$2") =>
        c.toString
      case t: Product =>
        t.productIterator.map(a => show(a)).mkString("(", ",", ")")
      case _ =>
        if (obj.isInstanceOf[AnyRef])
          obj.asInstanceOf[AnyRef].toString
        else
          "" + obj
    }
  }

我选择对此进行编码以避免添加 scalaz 依赖项(假设他们的 Show 类支持类似的功能)

于 2013-12-15T03:22:16.797 回答