咱们先看下面这段简单的JavaScript代码。编程
我在第10行调用了函数f,其中传入的第二个和第三个参数都是一个逗号表达式。编程语言
函数f的实现,会检查这两个参数的类型,若是是函数,则执行函数调用,再打印其返回值,不然直接打印传入的表达式的值。函数式编程
执行上面这段代码,打印输出以下:函数
咱们能够看出,虽然传入的第一个参数为true,致使函数f内部只会打印第二个参数y表明的表达式的值,5,可是第三个参数表明的表达式在函数f调用时,也进行了表达式求值,因此最后console也输出了Big calculation2。测试
若是咱们想实现所谓的“惰性求值”,有时候也称”惰性计算“,那么只须要将本来写在表达式位置的逻辑用一个JavaScript函数包裹起来,以下:设计
再次调用f,此时传入的参数y和z的类型为函数,所以在f进行调用时,同以前传入的表达式不一样,这里并不会即时调用y和z表明的函数。打印输出:对象
咱们再来看看Scala关于表达式的处理是否和JavaScript一致。ip
Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各类特性。虚拟机
Scala 运行在Java虚拟机上,并兼容现有的Java程序。it
Scala 源代码被编译成Java字节码,因此它能够运行于JVM之上,并能够调用现有的Java类库。
下图第5行和第12行我分别定义了两个Scala函数exp_test1和exp_test2, 逻辑和以前的JavaScript函数f相似。
exp_test1接受的第二个和第三个参数类型为exp1 :=> Unit,意思是须要传入一个表达式,这个表达式的返回类型是Unit。
exp_test2接收的第二个和第三个参数类型为exp1() :=> Unit,意思是须要传入一个函数,这个函数没有任何输入参数,函数的返回类型是Unit。
第19行到第25行是对这两个函数的各类测试,打印输出:
能够看到,即便传入两个函数exp_test1和exp_test2的第二个和第三个参数都是表达式,Scala也能作到对表达式的惰性求值:
第19行和第20行的函数调用,第三个参数位置的表达式和函数都没有即时求值,而是惰性求值。
第22行和第23行的函数调用,第二个参数位置的表达式和函数都没有即时求值,而是惰性求值。
这个小例子说明了不一样的编程语言,对于函数调用的表达式求值方式可能采起了不一样的实现:惰性求值或者即时求值。
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码: