表达式求值策略(Evaluation Strategy)

Scala中所有的运算都是基于表达式的。
  • Call By Value - 对函数实参求值,且仅求值一次;函数调用之前对所有表达式进行求值
  • Call By Name - 函数实参每次在函数体内被用到时都会求值;函数形参类型以“=>”开头
进行函数设计和调用的过程中,要理解两者之间的差异,明白执行过程和期望的结果。
Scala通常使用“Call By Value”。

示例1:

object test {

  def test1(x: Int, y: Int): Int = x * x          //> test1: (x: Int, y: Int)Int
def test2(x: => Int, y: => Int): Int = x * x //> test2: (x: => Int, y: => Int)Int test1(3 + 4, 8) //> res0: Int = 49
test2(3 + 4, 8) //> res1: Int = 49 test1(7, 2 * 4) //> res2: Int = 49
test2(7, 2 * 4) //> res3: Int = 49 }
过程解释:
test1(3 + 4, 8) 的过程:test1(3+4, 8) -->test1(7. 8) -->7*7 -->49
test2(3 + 4, 8) 的过程:test2(3+4, 8) -->(3+4)*(3+4) -->7*(3+4) -->7*7 -->49
test1(7, 2 * 4) 的过程:test1(7, 8) -->7*7 -->49
test2(7, 2 * 4)) 的过程:7*7 -->49

示例2:

object test {

  def bar(x: Int, y: => Int) = 1                  //> bar: (x: Int, y: => Int)Int
def loop(): Int = loop //> loop: ()Int
bar(1, loop) //> res4: Int = 1
//bar(loop, 1) }
bar(1, loop) :
loop的返回值值传给call by name变量y,但y在函数体内没有被应用,loop没有运行和求值
bar(loop, 1) :
loop的返回值传给call by value的变量x,函数调用之前对所有表达式进行求值,由于loop是一个死循环,无法退出函数体,一直无法得到loop的返回值,从而导致此时不能正常调用bar函数

Scala - 快速学习04 - 求值策略的更多相关文章

  1. Scala基础篇-05求值策略

    Scala的求值策略有2种: call by value call by name 如何区分? 例子: def bar(x:Int,y: => Int) = def loop(): Int=lo ...

  2. 深入理解JavaScript系列(19):求值策略(Evaluation strategy)

    介绍 本章,我们将讲解在ECMAScript向函数function传递参数的策略. 计算机科学里对这种策略一般称为“evaluation strategy”(大叔注:有的人说翻译成求值策略,有的人翻译 ...

  3. Scala - 快速学习09 - 函数式编程:一些操作

    1- 集合类(collection) 系统地区分了可变的和不可变的集合. scala.collection包中所有的集合类 可变集合(Mutable) 顾名思义,意味着可以修改,移除或者添加一个元素. ...

  4. Scala - 快速学习08 - 函数式编程:高阶函数

    函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...

  5. Scala - 快速学习03 - 基础语法

    1- 变量 变量 mutable variable 在程序运行过程中其值可能发生改变的量 关键词var定义变量,定义时直接进行求值 常量 immutable variable 在程序运行过程中其值不会 ...

  6. OpenGL学习笔记——求值器和NURBS

    http://codercdy.com/openglxue-xi-bi-ji-qiu-zhi-qi-he-nurbs/ 在最底层,图形硬件所绘制的是点.直线和多边形(通常是三角形和四边形).平滑的曲线 ...

  7. scala快速学习笔记(二):控制结构,类和对象

    IV.控制结构 1.if/else 除基本用法外,if/else语句能用来赋值,进而代替?:运算符.这得益于在Scala中,每个语句块都有值,就是该语句块最后一个语句的值.请看下面的代码. def a ...

  8. scala快速学习笔记(一):变量函数,操作符,基本类型

    为了用spark,先学下scala. 参考教程:http://meetfp.com/zh/scala-basic doc查询:http://docs.scala-lang.org 其它资料:http: ...

  9. Scala - 快速学习05 - 数据结构

    1- 数组(Array) 数组一般包括定长数组和变长数组. 可以不指明数组类型,Scala会自动根据提供的初始化数据来推断出数组的类型. 在Scala中,对数组元素的应用,是使用圆括号,而不是方括号. ...

随机推荐

  1. Yii2.0 解决“the requested URL was not found on this server”问题

    在你下了 Yii 框架,配置完路由 urlManager 后,路由访问页面会报错“the requested URL was not found on this server”,url类似于这种“ht ...

  2. HDU 6161.Big binary tree 二叉树

    Big binary tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. php实现下载模板与上传模板解析

    <? //下载模板的请求 if(isset($_GET['action']) && $_GET['action'] =='down_group_excel'){ $code = ...

  4. Job集群设计

  5. vue.js中axios的封装

    基于前文所述,axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它有很多优秀的特性,例如拦截请求和响应.取消请求.转换json.客户端防御XSRF等. 如果还对a ...

  6. python数据结构(二)------列表

    本文将重点梳理列表及列表操作. 2.1 list函数 2.2 基本列表操作 2.3 列表方法 2.1 list函数 >>>list('hello') ['h','e','l',l', ...

  7. spring切换多数据源

    应用场景:在一个项目需要用到两个或两个以上的数据库时,要进行切换数据库,来操作相应的表. 框架:用的是spring 的org.springframework.jdbc.datasource.looku ...

  8. H5新特性---SVG--椭圆--直线--文本--滤镜(高斯滤镜--模糊)--地理定位

    今天的目标 3.1:h5新特性--SVG--椭圆 <ellipse rx="" ry=""  cx="" cy="" ...

  9. 磨人的Fragment的转换

    磨人的Fragment的转换 本次任务是 程序运行之后将第一个Fragment加载出来 然后点击"SHOW NEXT PAGE"切换到第二个Fragment 当再次点击按钮时下方出 ...

  10. Codeforces Round #538 (Div. 2) CTrailing Loves (or L'oeufs?)

    这题明白的意思就是求n!在b进制下的后缀零的个数. 即最大的n!%(b^k)==0的k的值.我们需要将如果要构成b这个数,肯定是由一个个质因子相乘得到的.我们只需要求出b的质因子,然后分析n!中可以组 ...