zoukankan      html  css  js  c++  java
  • scala中的call-by-name和call-by-value

    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


  • 相关阅读:
    简单说说数据库表设计的三种范式
    存储过程简单的动态订单号
    Asp.Net页面生命周期
    jq 小笔记,上传判断其格式
    吃一垫长一智
    离散事件模拟
    二叉树查找树
    冷暖自知
    基督徒的人生箴言
    迷宫寻路
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5115865.html
Copyright © 2011-2022 走看看