我们先看下面这段简单的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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
相关推荐
Scala 正则表达式是 Scala 语言中的一种强大工具,用于模式匹配和字符串处理。在 Scala 中,正则表达式可以通过两种方式创建:通过 `r` 方法直接将字符串转换成正则表达式对象,或者直接显式地调用 `Regex` 构造函数...
我已经发现,Scala的理解有三个缺点: 他们只使用flatMap ,这可能是不必要的限制它们在if和match语句中的表现不佳不可能从理解中操纵上下文它们还具有一些优点: 更好地控制效果的顺序当您不关心效果的顺序时,...
wootjs, Scala 和JavaScript通过 Scala.js的WOOT模型 带 Scala.js的 WOOT协作文本编辑,使用WOOT算法。在 Scala 中实现,在JVM和JavaScript解释器上运行。不耐烦的 $ sbt server/run 然后打开 http:
Lambda表达式是函数式编程的基本组成部分,Java8和Scala都提供了强大的支持。在这篇文章中,我们深入讲解了Lambda表达式的优点和应用场景,希望读者能够更好地理解和应用Lambda表达式。 知识点: * Lambda表达式的...
在Java中使用Scala进行...总的来说,Scala的正则表达式功能强大且灵活,对于处理文本数据和进行模式匹配是非常有用的工具。理解并熟练运用这些规则,可以极大地提升在Java环境中使用Scala进行文本处理的效率和准确性。
Algorithm-algorithm-implementation-in-java-javascript-scala.zip,本项目的目标是提供Java、JavaScript和斯卡拉的可重用算法集合。,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
cron4s为Scala开发者提供了一种优雅的方式来处理CRON表达式,无论是在服务器端的JVM环境中,还是在客户端的JavaScript环境中。它的跨平台性、类型安全性和函数式接口,使得定时任务的管理变得简单而高效。通过理解和...
Scala Map和匿名类作为JavaScript对象 如果,同时,for..in和for语句 Scala if作为表达式(例如val a = if(true)1 else 2) Scala匹配作为JavaScript开关 基本的Scala类/特征定义到JavaScript对象定义的转换 全局...
复杂的表达式可以分解成可管理的部分,每个部分都可以独立测试和重用。 使用reb4s构建的模式本质上是自文档化的(至少,比正则表达式语法更多)。 由于支持组合,每个子表达式都可以被赋予一个有意义的名称来描述它...
Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...
Scala.js 是一个强大的工具,它将 Scala 语言的威力带入了前端开发的世界,通过将 Scala 代码编译成 JavaScript,使得开发者能够利用 Scala 的强大特性和类型安全性来构建 Web 应用程序。这个工具的核心目标是提供一...
下面分别从控制流、表达式、声明、模式和类型几个方面来比较Swift和Scala的语法。 控制流: Swift和Scala都提供了常见的控制流结构,如for循环、while循环和if条件语句。 在for循环中,Swift使用for-in来遍历集合或...
Scala文件读写操作与正则表达式 Scala语言提供了多种文件读写操作的方式,包括读取文本文件、读取二进制文件等。在Scala中,可以使用scala.io.Source对象来读取文件,该对象提供了多种方法来读取文件,例如getLines...
- **JVM兼容性**:Scala 2.12.x主要针对Java 8及更高版本进行优化,充分利用了JVM的新特性,如Lambda表达式和Stream API。 - **互操作性**:Scala可以直接调用Java库,反之亦然,这得益于良好的Java互操作性。 - ...
DataFrame允许进行SQL式的表达式操作,而Dataset结合了DataFrame的易用性和Scala的强类型安全,使得在大数据处理中编写类型安全的代码成为可能。 对于数据流处理,Spark Streaming构建在微批处理概念之上,它可以...
Scala是一种多范式的编程语言,融合了面向对象和函数式编程的特点,它运行在Java虚拟机(JVM)上,能够充分利用Java生态系统的资源。Scala-2.12.3是Scala的一个特定版本,它包含了对Java 8及更高版本的支持,并提供...
在Scala中,正则表达式是处理文本模式匹配的强大工具,它能够识别和操作字符串中的复杂模式。Scala的模式匹配提供了一种灵活的方式来对数据进行解构和分类,当与正则表达式结合时,这种能力得到了极大的提升。 首先...
1. **静态类型**:Scala是一个静态类型的编程语言,这意味着每个变量和表达式都有一个明确的类型,在编译时就能被确定,有助于避免运行时错误。 2. **强类型**:Scala具有严格的类型检查,确保代码的可靠性和安全性...