make corrections

This commit is contained in:
yejinchang 2015-04-16 17:53:40 +08:00
parent 60b56e777e
commit 4adbf231c8
2 changed files with 22 additions and 20 deletions

View File

@ -186,7 +186,7 @@ val sq: Int => Int = x => x * x
// Anonymous functions can be called as usual: // Anonymous functions can be called as usual:
sq(10) // => 100 sq(10) // => 100
// If your anonymous function has one or two arguments, and each argument is // If each argument in your anonymous function is
// used only once, Scala gives you an even shorter way to define them. These // used only once, Scala gives you an even shorter way to define them. These
// anonymous functions turn out to be extremely common, as will be obvious in // anonymous functions turn out to be extremely common, as will be obvious in
// the data structure section. // the data structure section.
@ -465,6 +465,7 @@ val patternFunc: Person => String = {
// Scala allows methods and functions to return, or take as parameters, other // Scala allows methods and functions to return, or take as parameters, other
// functions or methods. // functions or methods.
val add10: Int => Int = _ + 10 // A function taking an Int and returning an Int
List(1, 2, 3) map add10 // List(11, 12, 13) - add10 is applied to each element List(1, 2, 3) map add10 // List(11, 12, 13) - add10 is applied to each element
// Anonymous functions can be used instead of named functions: // Anonymous functions can be used instead of named functions:

View File

@ -8,10 +8,11 @@ contributors:
translators: translators:
- ["Peiyong Lin", ""] - ["Peiyong Lin", ""]
- ["Jinchang Ye", "http://github.com/alwayswithme"] - ["Jinchang Ye", "http://github.com/alwayswithme"]
- ["Guodong Qu", "https://github.com/jasonqu"]
lang: zh-cn lang: zh-cn
--- ---
Scala - 一门可拓展的语言 Scala - 一门可拓展的语言
```scala ```scala
@ -103,7 +104,7 @@ true == false // false
'a' // Scala 的字符 'a' // Scala 的字符
// '不存在单引号字符串' <= 这会导致错误 // '不存在单引号字符串' <= 这会导致错误
// 字符串定义了常见的 Java 方法 // String 有常见的 Java 字符串方法
"hello world".length "hello world".length
"hello world".substring(2, 6) "hello world".substring(2, 6)
"hello world".replace("C", "3") "hello world".replace("C", "3")
@ -174,14 +175,14 @@ addWithDefault(1) // => 6
// 匿名函数是这样的: // 匿名函数是这样的:
(x:Int) => x * x (x:Int) => x * x
// 和 def 不同,如果语义清晰,匿名函数的输入类型也可以省略。 // 和 def 不同,如果语义清晰,匿名函数的参数类型也可以省略。
// 类型 "Int => Int" 意味着这个函数接收一个 Int 并返回一个 Int。 // 类型 "Int => Int" 意味着这个函数接收一个 Int 并返回一个 Int。
val sq: Int => Int = x => x * x val sq: Int => Int = x => x * x
// 匿名函数的调用也是类似的: // 匿名函数的调用也是类似的:
sq(10) // => 100 sq(10) // => 100
// 如果您的匿名函数有一到两个参数,每一个参数仅使用一次, // 如果您的匿名函数中每个参数仅使用一次,
// Scala 提供一个更简洁的方式来定义他们。这样的匿名函数极为常见, // Scala 提供一个更简洁的方式来定义他们。这样的匿名函数极为常见,
// 在数据结构部分会明显可见。 // 在数据结构部分会明显可见。
val addOne: Int => Int = _ + 1 val addOne: Int => Int = _ + 1
@ -221,7 +222,7 @@ val r = 1 to 5
r.foreach( println ) r.foreach( println )
r foreach println r foreach println
// 留意: Scala 对点和括号的要求比较宽松,对这些规则加以区分 // 附注: Scala 对点和括号的要求想当宽松,注意其规则是不同的
// 这有助于写出读起来像英语的 DSL(领域特定语言) 和 API(应用编程接口)。 // 这有助于写出读起来像英语的 DSL(领域特定语言) 和 API(应用编程接口)。
(5 to 1 by -1) foreach ( println ) (5 to 1 by -1) foreach ( println )
@ -306,7 +307,7 @@ s(1)
// 为什么有这个? // 为什么有这个?
val divideInts = (x:Int, y:Int) => (x / y, x % y) val divideInts = (x:Int, y:Int) => (x / y, x % y)
divideInts(10,3) // 函数 divideInts 返回结果和余数 divideInts(10,3) // 函数 divideInts 同时返回结果和余数
// 要读取元组的元素,使用 _._nn是从1开始的元素索引 // 要读取元组的元素,使用 _._nn是从1开始的元素索引
val d = divideInts(10,3) val d = divideInts(10,3)
@ -322,9 +323,9 @@ d._2
/* /*
旁白: 教程中到现在为止我们所做的一切只是简单的表达式(值,函数等)。 旁白: 教程中到现在为止我们所做的一切只是简单的表达式(值,函数等)。
这些表达示可以输入到命令行解释器中作为快速测试,但它们无法单一的存在于 Scala 这些表达式可以输入到命令行解释器中作为快速测试,但它们不能独立存在于 Scala
文件。举个例子,您不能在 Scala 文件上简单的写上 "val x = 5"。而 Scala 允许存 文件。举个例子,您不能在 Scala 文件上简单的写上 "val x = 5"。相反 Scala 文件
的顶级结构是: 允许的顶级结构是:
- objects - objects
- classes - classes
@ -346,7 +347,7 @@ class Dog(br: String) {
private def sleep(hours: Int) = private def sleep(hours: Int) =
println(s"I'm sleeping for $hours hours") println(s"I'm sleeping for $hours hours")
// 抽象方法是没有方法体的方法。如果取消下面那行注释Dog 类需要被声明为 abstract // 抽象方法是没有方法体的方法。如果取消下面那行注释Dog 类必须被声明为 abstract
// abstract class Dog(...) { ... } // abstract class Dog(...) { ... }
// def chaseAfter(what: String): String // def chaseAfter(what: String): String
} }
@ -397,7 +398,7 @@ val otherGeorge = george.copy(phoneNumber = "9876")
///////////////////////////////////////////////// /////////////////////////////////////////////////
// 模式匹配是一个强大和常用的 Scala 特性。这是用模式匹配一个 case 类的例子。 // 模式匹配是一个强大和常用的 Scala 特性。这是用模式匹配一个 case 类的例子。
// 留意:不像其他语言, Scala 的 case 不需要 break 其他语言中 switch 语句的 // 附注:不像其他语言, Scala 的 case 不需要 break 其他语言中 switch 语句的
// fall-through 现象不会发生。 // fall-through 现象不会发生。
def matchPerson(person: Person): String = person match { def matchPerson(person: Person): String = person match {
@ -457,7 +458,7 @@ List(1, 2, 3) map add10 // List(11, 12, 13) - add10 被应用到每一个元素
// 匿名函数可以被使用来代替有命名的函数: // 匿名函数可以被使用来代替有命名的函数:
List(1, 2, 3) map (x => x + 10) List(1, 2, 3) map (x => x + 10)
// 下划线标志,如果匿名函数只有一个参数可以被使用来表示该参数变量 // 如果匿名函数只有一个参数可以用下划线作为变量
List(1, 2, 3) map (_ + 10) List(1, 2, 3) map (_ + 10)
// 如果您所应用的匿名块和匿名函数都接受一个参数,那么你甚至可以省略下划线 // 如果您所应用的匿名块和匿名函数都接受一个参数,那么你甚至可以省略下划线
@ -475,7 +476,7 @@ sSquared.filter(_ < 10)
sSquared.reduce (_+_) sSquared.reduce (_+_)
// filter 函数接受一个 predicate (函数从 A -> Boolean并选择 // filter 函数接受一个 predicate (函数根据条件 A 返回 Boolean并选择
// 所有满足 predicate 的元素 // 所有满足 predicate 的元素
List(1, 2, 3) filter (_ > 2) // List(3) List(1, 2, 3) filter (_ > 2) // List(3)
case class Person(name:String, age:Int) case class Person(name:String, age:Int)
@ -514,8 +515,8 @@ for { n <- s; nSquared = n * n if nSquared < 10} yield nSquared
* 就不可能做有意义的事情。这章节主要让你理解和使用隐式转换,而不是自己声明。 * 就不可能做有意义的事情。这章节主要让你理解和使用隐式转换,而不是自己声明。
*/ */
// 任何值val, 函数,对象等)可以被声明为隐式的,你可以猜到的,通过加上 "implicit" // 可以通过 "implicit" 声明任何值val, 函数,对象等)为隐式值,
// 关键字。请注意这些例子中我们用到第5部分的 Dog 类。 // 请注意这些例子中我们用到第5部分的 Dog 类。
implicit val myImplicitInt = 100 implicit val myImplicitInt = 100
implicit def myImplicitFunction(breed: String) = new Dog("Golden " + breed) implicit def myImplicitFunction(breed: String) = new Dog("Golden " + breed)
@ -542,13 +543,13 @@ def foo[T : C] = ...
// 编译器寻找隐式值另一种情况是你调用方法时 // 编译器寻找隐式值另一种情况是你调用方法时
// obj.method(...) // obj.method(...)
// 但 "obj" 没有一个名为 "method" 的方法。这样的话,如果存在一个将类型 A // 但 "obj" 没有一个名为 "method" 的方法。这样的话,如果有一个参数类型为 A
// 转变为 B 的隐式转换A 是 obj 的类型B有一个叫 "method" 的方法,这样 // 返回值类型为 B 的隐式转换obj 的类型是 AB 有一个方法叫 "method" ,这样
// 转换就会被应用。所以作用域里有上面的 myImplicitFunction, 我们可以这样做: // 转换就会被应用。所以作用域里有上面的 myImplicitFunction, 我们可以这样做:
"Retriever".breed // => "Golden Retriever" "Retriever".breed // => "Golden Retriever"
"Sheperd".bark // => "Woof, woof!" "Sheperd".bark // => "Woof, woof!"
// 这里字符串先被上面的函数转换为 Dog 对象,然后调用合适的方法。 // 这里字符串先被上面的函数转换为 Dog 对象,然后调用相应的方法。
// 这是相当强大的特性,但再次提醒,请勿轻率使用。 // 这是相当强大的特性,但再次提醒,请勿轻率使用。
// 事实上,当你定义上面的隐式函数时,编译器会作出警告,除非你真的了解 // 事实上,当你定义上面的隐式函数时,编译器会作出警告,除非你真的了解
// 你正在做什么否则不要使用。 // 你正在做什么否则不要使用。
@ -585,7 +586,7 @@ object Application {
// 输入输出 // 输入输出
// 按行读文件 // 按行读文件
import scala.io.Source import scala.io.Source