我试图使用隐式将scala中的选项值转换为String但不知何故它的工作原理。这是我的语法 -
object ToStringParser{
implicit def optionAnyToString[T](input: Option[T]):String = {
input match {
case Some(i) => i.toString
case None => "NULL"
}
}
}
我正在使用它 -
import domain.processors.ToStingParser._
println(submitDate)
但这总是打印 -
Some(2016-08-02T17:55:03.000-04:00)
我们如何隐含选项
答案 0 :(得分:5)
您的问题是println
接受Any
类型的参数,因此无法知道您希望它使用隐式转换,您必须以某种方式告诉它您想要一个String
,而不是Option
。
这样可行:println(submitDate: String)
,
这样:def puts(s: String) = println(s); puts(submitDate)
。
但与在这种情况下明确地执行此操作相比,它似乎并没有为您节省太多:
println(submitDate.getOrElse("NULL"))
这对读者来说会更加清晰。
答案 1 :(得分:1)
这里的问题是println
对传递给它的任何内容都需要Any
,这样你的隐式转换就不会被激活(它只是在其参数上调用.toString
)。
但是,如果你这样做:
def f(x: String) = x
println(f(Some(1)))
println(f(None))
你会发现你的隐式转换实际上很有效。
答案 2 :(得分:1)
@Dima是对的。我只想扩展隐含机制。
println(x)
接受String
类型的参数以及Any
。
在您的情况下,println(x: Any)
被调用,因为x
的类型为Option[String]
,最终会调用并打印x.toString()
。因此Some(...)
结果。
您需要强制调用println(x: String)
版本,该版本将强制从Option[T]
隐式转换为String
。
因此你想要:
import domain.processors.ToStringParser._
val submitDate: Option[DateTime] = // ...
println(submitDate: String)