[英]Implicit conversions in scala
Scala是否有对象的隐式转换? 例如,如果我有一个带有以下签名的方法:
object Foo {
def print(message: String) = println(message)
}
class Bar {
val baz = 1
}
我怎么称呼Foo.print(new Bar)
?
我可以在Bar
类上放置一个方法以隐式将Bar
实例转换为字符串,而不必在参数中调用toString
吗?
C#有这个,我想知道scala是否也有。
假设我们有Scala枚举:
object Color extends Enumeration {
type Method = Value
val RED, BLUE, GREEN = Value
}
然后我有一个课:
object ColorPrinter {
def print(x: String) = {
println(x)
}
}
ColorPrinter的打印方法无法更改。
我想调用ColorPrinter.print(Color.RED)
,但是我做不到。 我必须这样称呼它: ColorPrinter.print(Color.RED.toString)
。
我想避免不得不toString
将事物隐式转换为基本类型,例如String
或Int
并不是一个好主意(隐式转换可能会在您不期望的地方触发,从而产生细微,难以调试的问题)。
为什么不将其明确化? ?
class Bar {
val baz = 1
def print = Foo.print(toString)
}
new Bar().print
您可以放置隐式转换,这些转换可以自动应用而无需导入类的伴随对象中:
class Bar {
val baz = 1
}
// This should be the companion object of `Bar`, so if in console, use :paste mode
object Bar {
implicit def toString(bar: Bar): String = bar.toString
}
scala> Foo.print(new Bar) // works without `import Bar._`
$line7.$read$$iw$$iw$Bar@280ecc33
对于Enumeration
您可以将转换放入对象本身:
object Color extends Enumeration {
type Method = Value
val RED, BLUE, GREEN = Value
implicit def toString(value: Value): String = value.toString
}
scala> ColorPrinter.print(Color.RED) // works without `import Color._`
RED
您可以在以下答案中详细了解Scala中的隐式分辨率: https : //stackoverflow.com/a/5598107/1098230
这是一种典型的方法,是的,隐式与C#静态方法非常相似,并且以即席方式实现:
object Foo {
def print(message: String) = println(message)
}
class Bar {
val baz = 1
}
object BarToStringMaker {
implicit def barToString(b : Bar) : String = b.baz.toString
}
import BarToStringMaker._
Foo.print(new Bar)
更多阅读:
http://www.artima.com/pins1ed/implicit-conversions-and-parameters.html
希望能有所帮助,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.