为什么此代码无法编译,但在取消注释指示的行时成功编译?(我每晚都使用Scala 2.8).似乎显式调用string2Wrapper允许从该点隐式使用它.
class A {
import Implicits.string2Wrapper
def foo() {
//string2Wrapper("A") ==> "B" // <-- uncomment
}
def bar() {
"A" ==> "B"
"B" ==> "C"
"C" ==> "D"
}
object Implicits {
implicit def string2Wrapper(s: String) = new Wrapper(s)
class Wrapper(s: String) {
def ==>(s2: String) {}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:感谢目前为止的答案,其中包括指向Martin Odersky评论的指针,
"没有显式结果类型的隐式转换只能在自己定义的文本中可见.这样,我们就避免了循环引用错误."
我仍然有兴趣找出1)"循环参考错误"的危险是什么?,2)为什么显式调用有什么不同?
Scala中的类型类模式涉及定义特征,例如:
trait Show[T] {
def show(obj: T): String
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以定义此类型类的实例化:
object Show {
implicit val string = new Show[String] {
def show(obj: String): String = obj
}
implicit object BooleanShow extends Show[Boolean] {
def show(obj: Boolean): String = obj.toString
}
}
Run Code Online (Sandbox Code Playgroud)
为伴随对象中的基本类型定义这些实例化的优点是,无论何时涉及类型类(粗略地),它们都自动在范围内.
在功能上它似乎将实例化定义为隐式val或隐式对象不会发生太大变化.
有区别吗?有一种方式比另一种更好吗?
object Test extends App {
def print(s: String)(implicit p: Prefixer) = {
println(p.prefix + s)
}
print("test")
}
case class Prefixer(prefix: String)
object Prefixer {
implicit val p = Prefixer("***")
}
Run Code Online (Sandbox Code Playgroud)
上面的代码无法编译,因为编译器无法为Prefixer找到隐式值.但是,如果我将case类Prefixer和伴随对象放在另一个文件中,它就可以工作.这是为什么?