@@ -12,25 +12,25 @@ languages: [zh-cn]
12
12
| | |
13
13
| ------ | ------ |
14
14
| <span id =" variables " class =" h2 " >变量</span > | |
15
- | ` var x = 5 ` | 变量 |
15
+ | ` var x = 5 ` | 可变量 |
16
16
| <span class =" label success " >Good</span > ` val x = 5 ` <br > <span class =" label important " >Bad</span > ` x=6 ` | 常量 |
17
17
| ` var x: Double = 5 ` | 显式类型 |
18
18
| <span id =" functions " class =" h2 " >函数</span > | |
19
- | <span class =" label success " >Good</span > ` def f(x: Int) = { x*x } ` <br > <span class =" label important " >Bad</span > ` def f(x: Int) { x*x } ` | 定义函数 <br > 隐藏错误: 没有 “=”程序会返回Unit类型,这将会引起重大灾难 。 |
19
+ | <span class =" label success " >Good</span > ` def f(x: Int) = { x*x } ` <br > <span class =" label important " >Bad</span > ` def f(x: Int) { x*x } ` | 定义函数 <br > 隐藏出错: 不加 “=”号将会是一段返回Unit类型的过程,这将会导致意想不到的错误 。 |
20
20
| <span class =" label success " >Good</span > ` def f(x: Any) = println(x) ` <br > <span class =" label important " >Bad</span > ` def f(x) = println(x) ` | 定义函数 <br > 语法错误: 每个参数都需要指定类型。 |
21
21
| ` type R = Double ` | 类型别名 |
22
22
| ` def f(x: R) ` vs.<br > ` def f(x: => R) ` | 传值调用 <br > 传名调用 (惰性参数) |
23
23
| ` (x:R) => x*x ` | 匿名函数 |
24
24
| ` (1 to 5).map(_*2) ` vs.<br > ` (1 to 5).reduceLeft( _+_ ) ` | 匿名函数: 下划线是arg参数的占位符。 |
25
25
| ` (1 to 5).map( x => x*x ) ` | 匿名函数: 必须命名以后才可以使用一个arg参数两次。 |
26
- | <span class =" label success " >Good</span > ` (1 to 5).map(2*) ` <br > <span class =" label important " >Bad</span > ` (1 to 5).map(*2) ` | 匿名函数: 边界前缀方法,理智的人都用 ` 2*_ ` 。 |
27
- | ` (1 to 5).map { x => val y=x*2; println(y); y } ` | 匿名函数: 程序块风格,返回的是最后一个表达式 。 |
28
- | ` (1 to 5) filter {_%2 == 0} map {_*2} ` | 匿名函数: 管道风格(或者叫括号风格 )。 |
29
- | ` def compose(g:R=>R, h:R=>R) = (x:R) => g(h(x)) ` <br > ` val f = compose({_*2}, {_-1}) ` | 匿名函数: 要传入多个程序块的话,需要外部括号 。 |
30
- | ` val zscore = (mean:R, sd:R) => (x:R) => (x-mean)/sd ` | 柯里化, 很显然的语法 。 |
31
- | ` def zscore(mean:R, sd:R) = (x:R) => (x-mean)/sd ` | 柯里化, 很显然的语法 。 |
32
- | ` def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd ` | 柯里化,语法糖。 |
33
- | ` val normer = zscore(7, 0.4) _ ` | 需要在后面加下划线来部分应用(只适用于语法糖版本 )。 |
26
+ | <span class =" label success " >Good</span > ` (1 to 5).map(2*) ` <br > <span class =" label important " >Bad</span > ` (1 to 5).map(*2) ` | 匿名函数: 绑定前缀方法,理智的方法是 ` 2*_ ` 。 |
27
+ | ` (1 to 5).map { x => val y=x*2; println(y); y } ` | 匿名函数: 程序块风格,最后一个表达式作为返回值 。 |
28
+ | ` (1 to 5) filter {_%2 == 0} map {_*2} ` | 匿名函数: 管道风格(或者用圆括号 )。 |
29
+ | ` def compose(g:R=>R, h:R=>R) = (x:R) => g(h(x)) ` <br > ` val f = compose({_*2}, {_-1}) ` | 匿名函数: 要传入多个程序块的话,需要外围括号 。 |
30
+ | ` val zscore = (mean:R, sd:R) => (x:R) => (x-mean)/sd ` | 柯里化, 显然的语法 。 |
31
+ | ` def zscore(mean:R, sd:R) = (x:R) => (x-mean)/sd ` | 柯里化, 显然的语法 。 |
32
+ | ` def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd ` | 柯里化,语法糖。然后:) |
33
+ | ` val normer = zscore(7, 0.4) _ ` | 需要在尾部加下划线来变成偏函数(只对语法糖版本适用 )。 |
34
34
| ` def mapmake[T](g:T=>T)(seq: List[T]) = seq.map(g) ` | 泛型 |
35
35
| ` 5.+(3); 5 + 3 ` <br > ` (1 to 5) map (_*2) ` | 中缀语法糖 |
36
36
| ` def sum(args: Int*) = args.reduceLeft(_+_) ` | 可变参数 |
@@ -39,28 +39,28 @@ languages: [zh-cn]
39
39
| ` import scala.collection.Vector ` <br > ` import scala.collection.{Vector, Sequence} ` | 选择性导入 |
40
40
| ` import scala.collection.{Vector => Vec28} ` | 重命名导入 |
41
41
| ` import java.util.{Date => _, _} ` | 导入java.util包里除Date之外的所有文件. |
42
- | ` package pkg ` _ at start of file_ <br > ` package pkg { ... } ` | 声明一个包 |
42
+ | ` package pkg ` _ at start of file_ <br > ` package pkg { ... } ` | 声明这是一个包 |
43
43
| <span id =" data_structures " class =" h2 " >数据结构</span > | |
44
44
| ` (1,2,3) ` | 元组字面量 (` Tuple3 ` ) |
45
45
| ` var (x,y,z) = (1,2,3) ` | 解构绑定:通过模式匹配来解构元组。 |
46
- | <span class =" label important " >Bad</span >` var x,y,z = (1,2,3) ` | 隐藏错误 :每一个变量都被赋值了整个元组。 |
46
+ | <span class =" label important " >Bad</span >` var x,y,z = (1,2,3) ` | 隐藏出错 :每一个变量都被赋值了整个元组。 |
47
47
| ` var xs = List(1,2,3) ` | 列表 (不可变). |
48
48
| ` xs(2) ` | 用括号索引 ([ slides] ( http://www.slideshare.net/Odersky/fosdem-2009-1013261/27 ) ) |
49
- | ` 1 :: List(2,3) ` | cons |
49
+ | ` 1 :: List(2,3) ` | Cons(构成) |
50
50
| ` 1 to 5 ` _ 等价于_ ` 1 until 6 ` <br > ` 1 to 10 by 2 ` | Range类型(语法糖) |
51
- | ` () ` _ (空括号)_ | Unit类型的专有成员 (相当于 C/Java 里的void). |
51
+ | ` () ` _ (空括号)_ | Unit类型的唯一成员 (相当于 C/Java 里的void). |
52
52
| <span id =" control_constructs " class =" h2 " >控制结构</span > | |
53
53
| ` if (check) happy else sad ` | 条件 |
54
54
| ` if (check) happy ` _ same as_ <br > ` if (check) happy else () ` | 条件(语法糖) |
55
55
| ` while (x < 5) { println(x); x += 1} ` | while循环 |
56
56
| ` do { println(x); x += 1} while (x < 5) ` | do while循环 |
57
57
| ` import scala.util.control.Breaks._ ` <br >` breakable { ` <br >` for (x <- xs) { ` <br >` if (Math.random < 0.1) break ` <br >` } ` <br >` } ` | break. ([ slides] ( http://www.slideshare.net/Odersky/fosdem-2009-1013261/21 ) ) |
58
- | ` for (x <- xs if x%2 == 0) yield x*10 ` _ 等价于_ <br >` xs.filter(_%2 == 0).map(_*10) ` | for循环 : filter/map |
59
- | ` for ((x,y) <- xs zip ys) yield x*y ` _ 等价于_ <br >` (xs zip ys) map { case (x,y) => x*y } ` | for循环 : 解构绑定 |
60
- | ` for (x <- xs; y <- ys) yield x*y ` _ 等价于_ <br >` xs flatMap {x => ys map {y => x*y}} ` | for循环 : 叉乘 |
61
- | ` for (x <- xs; y <- ys) { ` <br > ` println("%d/%d = %.1f".format(x, y, x/y.toFloat)) ` <br >` } ` | for循环 : 不可避免的格式<br >[ sprintf-style] ( http://java.sun.com/javase/6/docs/api/java/util/Formatter.html#syntax ) |
62
- | ` for (i <- 1 to 5) { ` <br > ` println(i) ` <br >` } ` | for循环 : 包括上边界的遍历 |
63
- | ` for (i <- 1 until 5) { ` <br > ` println(i) ` <br >` } ` | for循环 : 忽略上边界的遍历 |
58
+ | ` for (x <- xs if x%2 == 0) yield x*10 ` _ 等价于_ <br >` xs.filter(_%2 == 0).map(_*10) ` | for comprehension (for 导出) : filter/map |
59
+ | ` for ((x,y) <- xs zip ys) yield x*y ` _ 等价于_ <br >` (xs zip ys) map { case (x,y) => x*y } ` | for comprehension (for 导出) : 解构绑定 |
60
+ | ` for (x <- xs; y <- ys) yield x*y ` _ 等价于_ <br >` xs flatMap {x => ys map {y => x*y}} ` | for comprehension (for 导出) : 叉乘 |
61
+ | ` for (x <- xs; y <- ys) { ` <br > ` println("%d/%d = %.1f".format(x, y, x/y.toFloat)) ` <br >` } ` | for comprehension (for 导出) : 不可避免的格式<br >[ sprintf-style] ( http://java.sun.com/javase/6/docs/api/java/util/Formatter.html#syntax ) |
62
+ | ` for (i <- 1 to 5) { ` <br > ` println(i) ` <br >` } ` | for comprehension (for 导出) : 包括上边界的遍历 |
63
+ | ` for (i <- 1 until 5) { ` <br > ` println(i) ` <br >` } ` | for comprehension (for 导出) : 忽略上边界的遍历 |
64
64
| <span id =" pattern_matching " class =" h2 " >模式匹配</span > | |
65
65
| <span class =" label success " >Good</span > ` (xs zip ys) map { case (x,y) => x*y } ` <br > <span class =" label important " >Bad</span > ` (xs zip ys) map( (x,y) => x*y ) ` | 在函数的参数中使用模式匹配的例子。 |
66
66
| <span class =" label important " >Bad</span ><br >` val v42 = 42 ` <br >` Some(3) match { ` <br >` case Some(v42) => println("42") ` <br >` case _ => println("Not 42") ` <br >` } ` | "v42" 被解释为可以匹配任何Int类型值的名称,打印输出"42"。 |
@@ -74,10 +74,10 @@ languages: [zh-cn]
74
74
| ` abstract class D { ... } ` | 定义一个抽象类。(不可创建) |
75
75
| ` class C extends D { ... } ` | 定义一个继承子类。 |
76
76
| ` class D(var x: R) ` <br >` class C(x: R) extends D(x) ` | 继承与构造器参数(愿望清单: 默认自动传参)
77
- | ` object O extends D { ... } ` | 定义一个单例模式(模块化的 ) |
77
+ | ` object O extends D { ... } ` | 定义一个单例(和模块一样 ) |
78
78
| ` trait T { ... } ` <br >` class C extends T { ... } ` <br >` class C extends D with T { ... } ` | 特质<br >带有实现的接口,没有构造参数。 [ mixin-able] ({{ site.baseurl }}/tutorials/tour/mixin-class-composition.html).
79
79
| ` trait T1; trait T2 ` <br >` class C extends T1 with T2 ` <br >` class C extends D with T1 with T2 ` | (混入)多个特质 |
80
- | ` class C extends D { override def f = ...} ` | 必须声明函数的重写 。 |
80
+ | ` class C extends D { override def f = ...} ` | 必须声明覆盖该方法 。 |
81
81
| ` new java.io.File("f") ` | 创建对象。 |
82
82
| <span class =" label important " >Bad</span > ` new List[Int] ` <br > <span class =" label success " >Good</span > ` List(1,2,3) ` | 类型错误: 抽象类型<br >相反,习惯上:调用工厂(方法)会自动推测类型 |
83
83
| ` classOf[String] ` | 类字面量 |
0 commit comments