[英]Scala: the magic behind implicits
我整个周末都在Scala中玩“隐性游戏”,但是我仍然难以理解整个概念。 这个问题是基于我以前的问题 。 我决定进一步采取以下措施:
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行
我在这里做错了什么? 我开始认为使用隐式会减少我的控制
不是很重要,但是有没有更安全的隐式方式? 一种让我确切了解正在发生什么的方式?
您两次调用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
选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.