繁体   English   中英

Scala:隐式背后的魔力

[英]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

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

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

  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选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM