- Scala 的 if 和 Java 中的用法差不多,但它在 Scala 是个表达式而不仅是条语句,它是有返回值,这让我们用起来很方便。在 Java 中我们一般先声明一个变量,在 if 语句中不同条件下赋不同的值。Scala 中就一条赋值表达式
val a = if (x == 5) 100 else if(x == 10) 200 else 300val关键字是用来定义值的,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 的值,所以需要耗费些时间
Read More
a: Int = -243309312
scala> def b = (1 to 1000000000).foldLeft(0){(a,b)=>a+b} //定义时很快,每次使用 b 时计算,其实就是定义一个方法,应该好理解
b: Int - 本视频继续讲了 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(x: Int, y: => Int) = 1 用 scalac 编译后再 javap -c 反编译看到的是:
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,所以很慢public int constOne(int, scala.Function0<java.lang.Object>);
Read More
Code:
0: iconst_1
1: ireturn - 进到 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 操作,或者可以说是静态与动态求值。

要指定函数参数 y 以 Call-By-Name 传递,要这么定义def test(x: Int, y: => Int) = x * x,这样就避免了 test(3, 2*4) 调用时2*4被求值,这里把 y 转换成了函数参数y: => Int。
Read More - 开始真正进入 Scala 编程的世界。
范式是一个比较抽象的概念,可以理解规范和模式,此视频让我们了解编程语言范式分类。我们原来接触过指令式,过程式及一直广泛应用的面向对象式编程,面向方面不算数。Scala 让我们进入到了函数式编程,不像 Haskell, Scala 把面向对象与函数式编程很多的连接了起来。进到 Scala 的世界,一定要时常性的用函数式编程思维武装自己的头脑,并且在多核的时代尽可能的 Immutable。
有狭义和广义函数式编程语言之分,狭义函数式没有变量,没有赋值操作,没有循环等指令式控制结构--代表用 Pure List, XSLT 等;广义函数式更宽松,尽量用 immutable, 函数是第一等公民,像 Scala, Clojure 等。
Read More - 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. Read More - 随着苹果在 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.
Read More - 不清楚现在用 Linux 桌面做编程的有多少了,主要由 Ubuntu 和 RedHat 来支撑了。Mac OS X 倒是越发流行起来。
本视频示例了在 Ubuntu 上安装 JDK, SBT -- 下载,解压,设置 PATH 的过程。以及如何下载安接 Scala SDK IDE (集成了 Scala SDK, Scala 插件的 Eclipse,这样就不用单独安装那三个玩意儿)。
接着在 Scala IDE 中演示了 Scala HelloWorld 程序,最后就是 Scala WorkSheet,比 Scala 命令行下的 REPL 更强大的交互式工具,比 Swift 还早的 Playground.
Read More - Functional Programming Principles in Scala 课程介绍及课程安排,视频中会提些小问题,会在后面的视频中看到答案。 其后三个视频将会涉及到 Scala 环境的设置,包括 Windows, Mac OS X 和 Linux 下的工具设置。我们将接触到 SBT(Simple Build Tool), 其实是名不符实,SBT 是我用过最不简单的构建工具。我也觉得 SBT 叫做 Scala Build Tool 才合适,可以选择 Gradle,不过本课程是用 SBT。 IDE 的话基本就是 Eclipse, IDEA 二分天下。
挂上了英文字幕,你要在官方学完这套课程还能得到一个认证,形式而已。
Read More - JUnit 是个很著名的飞行模式测试框架,即使到了 Scala 中还是免不了要用 JUnit Style 的测试方式,基于 Spec 的方式并不处处行得通,比如想要在 Scala 中使用 JMockit 框架时。
JUnit 提供给我们有两个扩展点,Runner 和 Rule, Runner 扩展点一般被各种框架劫持了,自己搞个@RunWith(SomeRunner.class)可能让你无法在测试中应用框架。于是剩下了 Rule 是个更自由的扩展点,这里不讲述怎么定制自己的 Rule,而是怎么用它,怎么在 Scala 中用它。之前的一篇 JUnit 4 如何正确测试异常 中使用了ExpectedException这个 Rule。
Rule 的要求是: Annotates fields that reference rules or methods that return a rule. A field must be public, not static, and a subtype ofTestRule(preferred) orMethodRule. A method must be public, not static, and must return a subtype ofTestRule(preferred) orMethodRule. 属性或方法必须是 public 非静态的,它们的类型或返回类型必须分别是 TestRule 和 MethedRule。
这里尝试以 Java 的方式使用另一个 Rule,TestName, 可以得到当前测试方法的名称 Read More