资讯专栏INFORMATION COLUMN

聊聊JavaScript和Scala的表达式 Expression

canopus4u / 2646人阅读

摘要:接受的第二个和第三个参数类型为,意思是需要传入一个表达式,这个表达式的返回类型是。第行和第行的函数调用,第二个参数位置的表达式和函数都没有即时求值,而是惰性求值。

我们先看下面这段简单的JavaScript代码。

我在第10行调用了函数f,其中传入的第二个和第三个参数都是一个逗号表达式。

函数f的实现,会检查这两个参数的类型,如果是函数,则执行函数调用,再打印其返回值,否则直接打印传入的表达式的值。

执行上面这段代码,打印输出如下:

我们可以看出,虽然传入的第一个参数为true,导致函数f内部只会打印第二个参数y代表的表达式的值,5,但是第三个参数代表的表达式在函数f调用时,也进行了表达式求值,所以最后console也输出了Big calculation2。

如果我们想实现所谓的“惰性求值”,有时候也称”惰性计算“,那么只需要将原本写在表达式位置的逻辑用一个JavaScript函数包裹起来,如下:

再次调用f,此时传入的参数y和z的类型为函数,因此在f进行调用时,同之前传入的表达式不同,这里并不会即时调用y和z代表的函数。打印输出:

我们再来看看Scala关于表达式的处理是否和JavaScript一致。

Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。

Scala 运行在Java虚拟机上,并兼容现有的Java程序。

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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98616.html

相关文章

  • Scala类型推导

    摘要:提供了类型推导来解决这个问题。函数式语言里比较经典的类型推导的方法是,并且它是在里首先使用的。的类型推导有一点点不同,不过思想上是一致的推导所有的约束条件,然后统一到一个类型上。而推导器是所有类型推导器的基础。 Scala类型推导 之剑 2016.5.1 00:38:12 类型系统 什么是静态类型?为什么它们很有用? 根据Picrce的说法:类型系统是一个可以根据代码段计算出来的值对...

    SQC 评论0 收藏0
  • Java 8 vs. Scala(一): Lambda达式

    摘要:编程语言将函数作为一等公民,函数可以被作为参数或者返回值传递,因为它被视为对象。是表示已注释接口是函数接口的注释。如果一个函数有一个或多个参数并且有返回值呢为了解决这个问题,提供了一系列通用函数接口,在包里。 【编者按】虽然 Java 深得大量开发者喜爱,但是对比其他现代编程语言,其语法确实略显冗长。但是通过 Java8,直接利用 lambda 表达式就能编写出既可读又简洁的代码。作者...

    yuanxin 评论0 收藏0
  • Dubbo压测插件实现——基于Gatling

    摘要:为了控制压测时的,则需要实现逻辑。则是获取属性并初始化客户端客户端配置则提供了设置泛化调用入参的以及接下来要介绍的部分的全链路压测中,我们都使用校验请求结果,压测插件中,我们也实现了基于的校验。 Dubbo 压测插件已开源,本文涉及代码详见gatling-dubbo Gatling 是一个开源的基于 Scala、Akka、Netty 实现的高性能压测框架,较之其他基于线程实现的压测框架...

    BigTomato 评论0 收藏0
  • Dubbo压测插件实现——基于Gatling

    摘要:为了控制压测时的,则需要实现逻辑。则是获取属性并初始化客户端客户端配置则提供了设置泛化调用入参的以及接下来要介绍的部分的全链路压测中,我们都使用校验请求结果,压测插件中,我们也实现了基于的校验。 Dubbo 压测插件已开源,本文涉及代码详见gatling-dubbo Gatling 是一个开源的基于 Scala、Akka、Netty 实现的高性能压测框架,较之其他基于线程实现的压测框架...

    CoreDump 评论0 收藏0
  • 函数式编程与面向对象编程[1]: Lambda达式 函数柯里化 高阶函数

    摘要:函数式编程与面向对象编程表达式函数柯里化高阶函数之剑什么是表达式例子定义表达式是一个匿名函数,表达式基于数学中的演算得名,直接对应于其中的抽象,是一个匿名函数,即没有函数名的函数。 函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数.md 之剑 2016.5.2 11:19:09 什么是lambda表达式 例子 For example, in Lisp the...

    张金宝 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<