我有一些看起来像这样的东西:
def a(b:String)(implicit c:String = "") = {println(b); b}
a("1")(a("2")(a("3")))
打印
3
2
1
我怎样才能让scala打印出来呢?
1
2
3
答案 0 :(得分:3)
懒惰始终是在不使用代码之前调用代码的方式。但是,在你的例子中,你根本就没有使用c
,这意味着当它是懒惰时,它根本就不会被调用。
稍微更改一下会导致:
scala> def a(b: String)(c: => String = "") = {println(b); c; b}
a: (b: String)(c: => String)String
scala> a("1")(a("2")(a("3")()))
1
2
3
res15: String = 1
这里,c
被声明为call-by-name,这会导致惰性行为。但是隐式参数不能按名称调用,因此我们必须使用更重量级的方法:
scala> import scala.language.implicitConversions
import scala.language.implicitConversions
scala> def a(b: String)(implicit c: () => String = () => "") = {println(b); c(); b}
a: (b: String)(implicit c: () => String)String
scala> implicit def conv(s: => String) = () => s
conv: (s: => String)() => String
scala> a("1")(a("2")(a("3")))
1
2
3
res0: String = 1
现在,懒惰更加明确,但我们需要隐式转换以允许原始语法。
总而言之,您不能只是切换函数参数的评估顺序,您必须了解懒惰才能从中受益。然而,懒惰带来了语法开销(至少在Scala中,例如在Haskell中它已经内置到语言中),因此它会导致代码的不同设计。