我有一些看起来是这样的:
def a(b:String)(implicit c:String = "") = {println(b); b}
a("1")(a("2")(a("3")))
其打印
3
2
1
我怎样才能得到斯卡拉打印出这个呢?
1
2
3
我有一些看起来是这样的:
def a(b:String)(implicit c:String = "") = {println(b); b}
a("1")(a("2")(a("3")))
其打印
3
2
1
我怎样才能得到斯卡拉打印出这个呢?
1
2
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
被声明为调用式的名字,这会导致懒惰行为。 然而隐含参数不能调用按姓名,因此,我们必须使用一个更重量级的方法:
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
现在,懒惰是更明确的,但我们需要的隐式转换,让您的原始语法。
总之,你不能只是切换的你的函数参数的评估顺序,你要明白懒惰从中受益。 然而懒惰带有语法开销(至少在斯卡拉,哈斯克尔例如,将已经内置到语言),因此导致了不同的设计你的代码。