Scala 如何测试异常

几年前整理过一篇 JUnit 4 如何正确测试异常,类似的问题:如何在 Scala 中测试异常呢?因 Scala 可以完全采用 JUnit 测试用例的风格,所以当然可以运用 Java 的三种方式来测试异常,即

  1. try { 待测试代码; fail() } catch(某种异常) {断言}
  2. @Test(expected = Exception.class)
  3. @Rule

回到 Scala 中来,我并不那么情愿在 Scala 中使用 JUnit 的 @Test def testMethod() 这样的测试方法风格,而多少采用 BDD 或者叫更 DSL 的风格。

那看看我们 Scala 有些什么独到的异常测试方法

一: intercept 阅读全文 >>

Scala 函数式编程学习视频 -- 条件和值定义

Scala 的 if 和 Java 中的用法差不多,但它在 Scala 是个表达式而不仅是条语句,它是有返回值,这让我们用起来很方便。在 Java 中我们一般先声明一个变量,在 if 语句中不同条件下赋不同的值。Scala 中就一条赋值表达式

val a = if (x == 5) 100 else if(x == 10) 200 else 300

val 关键字是用来定义值的,value 的缩写,就是 Java 中的常量 public static final

这里也同样涉及到了 call-by-name, call-by-value,到 Scala 控制台下试下

scala> val a = (1 to 1000000000).foldLeft(0){(a,b)=>a+b} //定义时就要算出 foldLeft 的值,所以需要耗费些时间
a: Int = -243309312

scala> def b = (1 to 1000000000).foldLeft(0){(a,b)=>a+b} //定义时很快,每次使用 b 时计算,其实就是定义一个方法,应该好理解
b: Int

阅读全文 >>

Scala 函数式编程学习视频 -- 求值策略和终止

本视频继续讲了 CBN(Call By Name) 和 CBV(Call By Value),它们就是一种求值策略。一般的 Scala 是采用 call-by-value,当函数的参数是使用的 => 来声明参数,就是 call-by-name, => 是 Lambda 用的符号,y 有点像是个函数参数。=> 就是告诉这个参数会采用 call-by-name。看个例子:

def constOne(x: Int, y: => Int) =1 //函数返回一个常数,x, y 分别是 CBV, CBN
constOne(23, (1 to 1000000000).foldLeft(0){(a,b)=>a+b}) //CBN, 把 foldLeft 表达式传给 constOne,希望在 constOne 中计算,所以很快
constOne((1 to 1000000000).foldLeft(0){(a,b)=>a+b}, 23) //CBV, 计算出 foldLeft 后值传给 constOne,所以很慢

上面的 constOne(x: Int, y: => Int) = 1 用 scalac 编译后再 javap -c 反编译看到的是:

public int constOne(int, scala.Function0<java.lang.Object>);
Code:
0: iconst_1
1: ireturn

阅读全文 >>

Scala 函数式编程学习视频 -- 编程元素

进到 Scala 的 REPL (Read-Eval-Print-Loop) 有两种方式,scala 或 sbt console。函数式的任务就是求值(reduction steps),Scala 把表达式和方法进行了统一,Scala 的变量和函数也应作一致性思考。Substitution Model, no side effects, λ-calculus -> immutable。 Call-by-name vs call-by-value ,是调用者还是被调用者来对参数求值的问题。val 定义值时,会做 call-by-value 操作,def 则会做 call-by-name 操作,或者可以说是静态与动态求值。

Scala Call-By-Name vs Call-By-Value

要指定函数参数 y 以 Call-By-Name 传递,要这么定义 def test(x: Int, y: => Int) = x * x,这样就避免了 test(3, 2*4) 调用时 2*4 被求值,这里把 y 转换成了函数参数 y: => Int

阅读全文 >>

Scala 函数式编程学习视频 -- 编程范式

开始真正进入 Scala 编程的世界。

范式是一个比较抽象的概念,可以理解规范和模式,此视频让我们了解编程语言范式分类。我们原来接触过指令式,过程式及一直广泛应用的面向对象式编程,面向方面不算数。Scala 让我们进入到了函数式编程,不像 Haskell, Scala 把面向对象与函数式编程很多的连接了起来。进到 Scala 的世界,一定要时常性的用函数式编程思维武装自己的头脑,并且在多核的时代尽可能的 Immutable

有狭义和广义函数式编程语言之分,狭义函数式没有变量,没有赋值操作,没有循环等指令式控制结构--代表用 Pure List, XSLT 等;广义函数式更宽松,尽量用 immutable, 函数是第一等公民,像 Scala, Clojure 等。

阅读全文 >>

Scala 函数式编程学习视频 -- 总目

Coursera 上的 Functional Programming Principle in Scala 视频教程,合成了英文字幕,应该没有多大必要性翻译成中文字幕,本人觉得大家的英语都比我强,因为它是我永久的,历史的伤口。

该课程共有七周的课时,算下来每天十至二十多分钟的时间。

开始教程

第一周:函数和求值 阅读全文 >>

Scala 函数式编程学习视频 -- 指导: 编程作业

基本上每个阶段过后都有一个不小的练习,本视频告诉我们怎么下载练习并导入到 Scala IDE,可在 SBT 下提交代码,不在 Cousera 上学习的话,也没法提交。可以从这里把那几个练习下载过来试试身手。

有兴趣的同学可以从下面的链接下载红练习项目:

example   recfun   funsets  objsets   patmat  forcomp  streams

阅读全文 >>

Scala 函数式编程学习视频 -- Windows 下工具设置

Windows 无疑还是最大众化的个人操作系统了,很少很少人在 Windows 下用 Open-JDK。

本视频示例了在 Windows 下 JDK, SBT 的安装,需要设置相关的 PATH 环境变量。以及下载安接 Scala SDK IDE (集成了 Scala SDK, Scala 插件的 Eclipse,这样就不用单独安装那三个玩意儿)。

接着在 Scala IDE 中演示了 Scala HelloWorld 程序,最后就是 Scala WorkSheet,比 Scala 命令行下的 REPL 更强大的交互式工具,比 Swift 还早的 Playground. 阅读全文 >>

Scala 函数式编程学习视频 -- Mac OS X 下工具设置

随着苹果在 iPhone, iPad 以及 Apple Watch 上的造势,Mac OS X 也越来越流行起来。我们公司最近购置了不少的 Mac 设备,本人在 Apple 平台上工作已有三年了,对 Windows 系统感觉陌生了。

本视频示例了在 Mac OS X 下的 JDK, SBT 安装,一般 Mac OS X 随机安装了 JDK,若没有的话执行 java -version 会带领你安装 JDK。需要设置 SBT 的 PATH。以及如何下载安接 Scala SDK IDE (集成了 Scala SDK, Scala 插件的 Eclipse,这样就不用单独安装那三个玩意儿)。

如果想要安装更高版本的 JDK 也是要到 Oracle 去下载,还需设置新 JDK bin PATH 覆盖现有的。

接着在 Scala IDE 中演示了 Scala HelloWorld 程序,最后就是 Scala WorkSheet,比 Scala 命令行下的 REPL 更强大的交互式工具,比 Swift 还早的 Playground.

阅读全文 >>