http://www.jianshu.com/p/93eefcb61d4f

val和def的区别

在scala中,可以用val和def前缀来定义变量,例如:

 val  x = 1
def y = “foo”

这两者的区别在于:

  • val定义值时,会做call-by-value操作,
  • def则会做call-by-name操作。

例如:

 // 这是一个死循环
def loop: Boolean = loop // 用val定义时会做call-by-value,以下语句会block住
val x = loop // 用def定义时,是做的call-by-name。故以下语句暂时不会执行,在用到y的时候才做evaluation
def y = loop

陷到loop里时,用ctrl+c发中断信号终止。

函数定义中的call-by-name和call-by-value

首先思考一个问题,如何在不使用”||”和“&&”的情况下,实现如下两个函数and和or:

 and(x, y) == x && y
or(x, y) == x || y

对于and,可以用如下方式定义:

 def and(x: Boolean, y: Boolean) =
if (x) y else false // 测试
and(true, true) // => true
and(false, true) // => false

但是,这种定义在遇上循环的时候会有问题,例如

 and(false, loop)

上述语句会陷入循环,因为在我们的定义中,对于x和y参数的引用都是call-by-value的。要指定参数为call-by-name,只需要把函数定义改为如下形式即可:

 def and(x: Boolean, y: => Boolean) =
if (x) y else false // 测试
and(false, loop) // => false

注意我们在定义参数y的时候,使用的=>符号。

参考:
[1] https://class.coursera.org/progfun-003/lecture/5

scala中的call-by-name和call-by-value的更多相关文章

  1. Scala中apply的用法

    Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition Every fun ...

  2. scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  3. Scala中的None,Nothing,Null,Nil

    在scala中这四个类型名称很类似,作用确实完全不同的. None是一个object,是Option的子类型,定义如下 case object None extends Option[Nothing] ...

  4. Scala中Iterator允许执行一次

    背景 使用spark执行mapPartitionsWithIndex((index,iterator)=>{....}),在执行体中将iterator进行一次迭代后,再次根据iterator执行 ...

  5. 第52讲:Scala中路径依赖代码实战详解

    今天学习了scala中的路径依赖,来看一下实战代码 class Outer{  private val x = 10  class Inner{    private val y = x +10  } ...

  6. 第51讲:Scala中链式调用风格的实现代码实战及其在Spark编程中的广泛运用

    今天学习了下scala中的链式调用风格的实现,在spark编程中,我们经常会看到如下一段代码: sc.textFile("hdfs://......").flatMap(_.spl ...

  7. scala入门教程:scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  8. Scala 中object和class的区别

    Scala中没有静态类型,但是有有“伴侣对象”,起到类似的作用. Scala中类对象中不可有静态变量和静态方法,但是提供了“伴侣对象”的功能:在和类的同一个文件中定义同名的Object对象:(须在同一 ...

  9. scala中的抽象类

    scala中也有和java,c#类似的抽象类,抽象类会有部分实现,也有没有实现的方法定义.抽象类最大的特征是不能直接实例化.下面我们看个例子. abstract class Animal { def ...

  10. Scala 中 构造函数,重载函数的执行顺序

    在调试scala在线开发教程(http://www.imobilebbs.com/wordpress/archives/4911)的过程中看到了以下代码,但是这段代码无论怎么调试都无法成功. abst ...

随机推荐

  1. 【现代程序设计】【Homework-01】

    1维的最大子数组之和 对于1维的最大子数组之和 假设f[i]表示:对于1..i这个序列中,包含i这个元素的最大序列的值 则对于f[i],0<i<=n; 应该有 f[i]=max(a[i], ...

  2. [iOS基础控件 - 4.1] APP列表

    需求 1.以N宫格的形式展示应用信息 2.APP信息包括图标.名字.下载按钮 3.使用尽可能少的代码,从plist读取app信息,计算每个app图标的位置尺寸信息     A.思路 1.UI布局:N宫 ...

  3. [iOS基础控件 - 2] 按钮的基本使用

    UIButton A.素材准备 1.图片素材放置到Images.xcassets中     B.按钮状态 1.normal:默认状态 Default 对应的枚举常量:UIControlStateNor ...

  4. 【转】memcached工作原理介绍

    FROM: http://my.oschina.net/flynewton/blog/8984 官方主页: http://memcached.org/ 面临的问题  对于高并发高访问的Web应用程序来 ...

  5. javasctipt显示几分钟前、几天前等

    jsp页面: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...

  6. Windows ICS 服务无法启动问题解决

    防火墙打不开肯定是"windows Firewall"服务没有启动.ICS服务启动不了能够通过下面方法解决: 1.找到本地连接,单击左键--属性--共享--勾选(√)--确定,如以 ...

  7. Upcase 将edit1中的每个字符串改为首字母大写

    //将edit1中的每个字符串改为首字母大写 procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin    with ...

  8. c# 调用 c++写的DLL

    http://www.cnblogs.com/MarsPanda/archive/2012/09/03/2668522.html 解决办法 安装 vcredist 运行库 或者用VC6.0编写DLL ...

  9. VRRP协议具体解释

    转帖:http://blog.chinaunix.net/space.php?uid=11654074&do=blog&id=2857384 Contents              ...

  10. RapidXml用法

    一.写xml 文件 #include <iostream> #include "rapidxml/rapidxml.hpp" #include "rapidx ...