`
JerryWang_SAP
  • 浏览: 1032636 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

聊聊JavaScript和Scala的表达式 Expression

阅读更多

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

 

 
 
0
0
分享到:
评论

相关推荐

    scala正则表达式与模式匹配.doc

    Scala 正则表达式是 Scala 语言中的一种强大工具,用于模式匹配和字符串处理。在 Scala 中,正则表达式可以通过两种方式创建:通过 `r` 方法直接将字符串转换成正则表达式对象,或者直接显式地调用 `Regex` 构造函数...

    computation-expressions:Scala中计算表达式的实现

    我已经发现,Scala的理解有三个缺点: 他们只使用flatMap ,这可能是不必要的限制它们在if和match语句中的表现不佳不可能从理解中操纵上下文它们还具有一些优点: 更好地控制效果的顺序当您不关心效果的顺序时,...

    wootjs, Scala 和JavaScript通过 Scala.js的WOOT模型.zip

    wootjs, Scala 和JavaScript通过 Scala.js的WOOT模型 带 Scala.js的 WOOT协作文本编辑,使用WOOT算法。在 Scala 中实现,在JVM和JavaScript解释器上运行。不耐烦的 $ sbt server/run 然后打开 http:

    Java8与Scala中的Lambda表达式深入讲解

    Lambda表达式是函数式编程的基本组成部分,Java8和Scala都提供了强大的支持。在这篇文章中,我们深入讲解了Lambda表达式的优点和应用场景,希望读者能够更好地理解和应用Lambda表达式。 知识点: * Lambda表达式的...

    详解Java中的scala正则表达式

    在Java中使用Scala进行...总的来说,Scala的正则表达式功能强大且灵活,对于处理文本数据和进行模式匹配是非常有用的工具。理解并熟练运用这些规则,可以极大地提升在Java环境中使用Scala进行文本处理的效率和准确性。

    Algorithm-algorithm-implementation-in-java-javascript-scala.zip

    Algorithm-algorithm-implementation-in-java-javascript-scala.zip,本项目的目标是提供Java、JavaScript和斯卡拉的可重用算法集合。,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。

    cron4s:Scala的跨平台CRON表达式解析

    cron4s为Scala开发者提供了一种优雅的方式来处理CRON表达式,无论是在服务器端的JVM环境中,还是在客户端的JavaScript环境中。它的跨平台性、类型安全性和函数式接口,使得定时任务的管理变得简单而高效。通过理解和...

    jscala:Scala宏,可从Scala代码生成JavaScript

    Scala Map和匿名类作为JavaScript对象 如果,同时,for..in和for语句 Scala if作为表达式(例如val a = if(true)1 else 2) Scala匹配作为JavaScript开关 基本的Scala类/特征定义到JavaScript对象定义的转换 全局...

    reb4s:Scala 的正则表达式生成器

    复杂的表达式可以分解成可管理的部分,每个部分都可以独立测试和重用。 使用reb4s构建的模式本质上是自文档化的(至少,比正则表达式语法更多)。 由于支持组合,每个子表达式都可以被赋予一个有意义的名称来描述它...

    scala3 scala3 scala3 scala3 scala3

    Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...

    Scalajs是一个将Scala语言编译成JavaScript的工具

    Scala.js 是一个强大的工具,它将 Scala 语言的威力带入了前端开发的世界,通过将 Scala 代码编译成 JavaScript,使得开发者能够利用 Scala 的强大特性和类型安全性来构建 Web 应用程序。这个工具的核心目标是提供一...

    Swift和Scala语法的比较

    下面分别从控制流、表达式、声明、模式和类型几个方面来比较Swift和Scala的语法。 控制流: Swift和Scala都提供了常见的控制流结构,如for循环、while循环和if条件语句。 在for循环中,Swift使用for-in来遍历集合或...

    Scala的文件读写操作与正则表达式

    Scala文件读写操作与正则表达式 Scala语言提供了多种文件读写操作的方式,包括读取文本文件、读取二进制文件等。在Scala中,可以使用scala.io.Source对象来读取文件,该对象提供了多种方法来读取文件,例如getLines...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    DataFrame允许进行SQL式的表达式操作,而Dataset结合了DataFrame的易用性和Scala的强类型安全,使得在大数据处理中编写类型安全的代码成为可能。 对于数据流处理,Spark Streaming构建在微批处理概念之上,它可以...

    scala2.12.1Windows镜像包

    - **JVM兼容性**:Scala 2.12.x主要针对Java 8及更高版本进行优化,充分利用了JVM的新特性,如Lambda表达式和Stream API。 - **互操作性**:Scala可以直接调用Java库,反之亦然,这得益于良好的Java互操作性。 - ...

    Scala中正则表达式以及与模式匹配结合(多种方式)

    在Scala中,正则表达式是处理文本模式匹配的强大工具,它能够识别和操作字符串中的复杂模式。Scala的模式匹配提供了一种灵活的方式来对数据进行解构和分类,当与正则表达式结合时,这种能力得到了极大的提升。 首先...

    scala sdk scala-2.12.3

    Scala是一种多范式的编程语言,融合了面向对象和函数式编程的特点,它运行在Java虚拟机(JVM)上,能够充分利用Java生态系统的资源。Scala-2.12.3是Scala的一个特定版本,它包含了对Java 8及更高版本的支持,并提供...

    scala-2.11.12 win msi 安装包

    1. **静态类型**:Scala是一个静态类型的编程语言,这意味着每个变量和表达式都有一个明确的类型,在编译时就能被确定,有助于避免运行时错误。 2. **强类型**:Scala具有严格的类型检查,确保代码的可靠性和安全性...

Global site tag (gtag.js) - Google Analytics