相关疑难解决方法(0)

为什么Scala方法的显式调用允许隐式解析?

为什么此代码无法编译,但在取消注释指示的行时成功编译?(我每晚都使用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 implicit scala-2.8

16
推荐指数
2
解决办法
8198
查看次数

在Scala中提供类型类的实例时,使用val或object是否更好?

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或隐式对象不会发生太大变化.

有区别吗?有一种方式比另一种更好吗?

scala implicit typeclass

6
推荐指数
1
解决办法
167
查看次数

Scala隐含的伴随对象逻辑

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和伴随对象放在另一个文件中,它就可以工作.这是为什么?

scala implicit companion-object

1
推荐指数
1
解决办法
189
查看次数

标签 统计

implicit ×3

scala ×3

companion-object ×1

scala-2.8 ×1

typeclass ×1