我一直在玩"暗示"整个周末都在斯卡拉,但我仍然难以掌握整个概念。此问题基于我的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
如果我错了,请纠正我,但在这种情况下使用隐式会在找到一个字符串时插入一个字符串。我不确定为什么要打印7行而不是3行
我在这里做错了什么?我开始认为使用含义会减少对我的控制
不是那么重要,但是有更安全的方法可以解决这些问题吗?这种方式可以让我看到究竟发生了什么?
答案 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
回答你的三点:
() => String
,而不是String
。-Xlog-implicits
,-Xlog-implicit-conversions
和-Xprint:all
选项。