斯卡拉:暗示背后的魔力

时间:2014-06-16 02:53:38

标签: scala

我一直在玩"暗示"整个周末都在斯卡拉,但我仍然难以掌握整个概念。此问题基于我的previous one。我决定采取更进一步的措施:

def a(b: String)(implicit c: () => String = () => "") = {
    println(s"$b - up next is "+c());c();b
}

implicit def conv(s: => String) = () => s

当事情开始变得有点不可思议时:

scala> a("1")(a("2")(a("3")))
3 - up next is 
2 - up next is 3
3 - up next is 
1 - up next is 2
3 - up next is 
2 - up next is 3
3 - up next is 

这里的基本思路是让每一行都像这样引用:

1
2 from 1
3 from 2
4 from 3

  1. 如果我错了,请纠正我,但在这种情况下使用隐式会在找到一个字符串时插入一个字符串。我不确定为什么要打印7行而不是3行

  2. 我在这里做错了什么?我开始认为使用含义会减少对我的控制

  3. 不是那么重要,但是有更安全的方法可以解决这些问题吗?这种方式可以让我看到究竟发生了什么?

1 个答案:

答案 0 :(得分:3)

您正在调用c两次,而只调用一次:

def a(b: String)(implicit c: () => String = () => "") = {
  println(s"$b - up next is " + c())
  b
}

然后产生:

3 - up next is 
2 - up next is 3
1 - up next is 2

即使首先调用a("1"),它也必须在生成任何输出之前调用它传递的() => String。因此,a("3")是第一个产生输出的人。

您需要转过来,让a("2")告诉a("3")a("2")调用它:

def a(current: String, next: String => Unit = _ => ())(prev: String) = {
  println(s"$current from $prev")
  next(current)
}

并调用它:

a("1", a("2", a("3")))("nothing")

产生:

1 from nothing
2 from 1
3 from 2

回答你的三点:

  1. 不,您的隐式参数需要() => String,而不是String
  2. 见上文,这里不需要暗示。
  3. 阅读-Xlog-implicits-Xlog-implicit-conversions-Xprint:all选项。