斯卡拉:从外面阅读""而不是"内外"

时间:2014-06-15 07:45:45

标签: scala

我有一些看起来像这样的东西:

def a(b:String)(implicit c:String = "") = {println(b); b}

a("1")(a("2")(a("3")))

打印

  

3

     

2

     

1

我怎样才能让scala打印出来呢?

  

1

     

2

     

3

1 个答案:

答案 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中它已经内置到语言中),因此它会导致代码的不同设计。