为了解决上篇中 RationalTrait 的问题,有两个解决方案,第一方案是使用预先初始化成员的值的方法,这种方法可以让你在调用父类构造函数之前首先初始化子类的成员。这种方法,是把初始化成员变量的定义放在调用父构造函数之前。
抽象定义的 vals 在某些时候起到父类参数的角色,它们允许你在子类中提供最父类中省略的定义,这对于 Trait 来说尤其重要,因为 Trait 没有提供你可以传入参数的构造函数。因此为 Trait 提供参数支持通常是通过抽象 vals 来实现的。
Scala 中抽象类型,指的是在类或 Trait 中使用 type 定义的类型。 类或 trait 本身也可以使用 abstract 来定义,但这种使用 abstract 定义的类和 Trait 在 Scala 中不称为抽象类型。你可以把派生于抽象类型的 非抽象类型,比如前面例子 Concrete 中的类型 T,看作给一个类型起一个别名。比如 Concrete 类定义中 String 类型的别名为 T。
当一个类或是 Trait 的成员没有定义完整的实现时,称为抽象成员。抽象成员需要在其子类中完成实现,在 Scala 中,抽象成员除了成员函数外,也可以说成员变量或是抽象类型。 本系列教程介绍四种抽象成员,vals, vars ,methods 和 types。
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.更高级多态性类型 和 特设多态性Scala 可以对“更高阶”的类型进行抽象。例如,假设您需要用几种类型的容器处理几种类型的数据。你可能定义了一个 Container 的接口,它可以被实现为几种类型的容器:Option、List 等。
这里我们转载 (Twitter 的 Scala 课堂](http://twitter.github.io/scala_school/zh_cn/collections.html),转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.视界(“View”)有时候,你并不需要指定一个类型是等/子/超于另一个类,你可以通过转换这个类来伪装这种关联关系。一个视界指定一个类型可以被“看作是”另一个类型。
这里我们转载 Twitter 的 Scala 课堂,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.变性 VarianceScala 的类型系统必须同时解释类层次和多态性。类层次结构可以表达子类关系。在混合OO和多态性时,一个核心问题是:如果 T’ 是 T 一个子类, Container[T’] 应该被看做是 Container[T] 的子类吗?
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.什么是静态类型?它们为什么有用?按 Pierce 的话讲:“类型系统是一个语法方法,它们根据程序计算的值的种类对程序短语进行分类,通过分类结果错误行为进行自动检查。”类型允许你表示函数的定义域和值域。例如,从数学角度看这个定义:f: R ->
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.函数组合让我们创建两个函数:scala> def f(s: String) = "f(" + s + ")"f: (s: String)Stringscala> def g(s: String) = "g(" + s + ")"g: (s: String)Stringcomposecompose 组合其他函数形成一个新的函数 f(g(x))scala>
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.函数组合子(Functional Combinators)List(1, 2, 3) map squared 对列表中的每一个元素都应用了 squared 平方函数,并返回一个新的列表 List(1, 4, 9)。我们称这个操作 map 组合子。 (如果想要更好的定义,你可能会喜欢 Stackoverflow 上对组合子的说明。
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.基本数据结构Scala 提供了一些不错的集合列表 Listscala> val numbers = List(1, 2, 3, 4)numbers: List[Int] = List(1, 2, 3, 4)集 Set集没有重复scala> Set(1, 1, 2)res0: scala.collection.immutable.
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.异常Scala 中的异常可以在 try-catch-finally 语法中通过模式匹配使用。 try { remoteCalculatorService.add(1, 2)} catch { case e: ServerIsDownException => log.error(e, "the remote calculator service is unavailable.
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.模式匹配这是 Scala 中最有用的部分之一。匹配值scala> val times = 1times: Int = 1scala> scala> times match { | case 1 => "one" | case 2 => "two" | case _ =>
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自Twitter的Scala课堂中文翻译,部分有小改动.apply 方法当类或对象有一个主要用途的时候,apply 方法为你提供了一个很好的简洁的语法结构。scala> class Foo {}defined class Fooscala> object FooMaker { | def apply() = new Foo | }defined object FooMakerscala>
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.类scala> class Calculator { | val brand: String = "HP" | def add(m: Int, n: Int): Int = m + n | }defined class Calculatorscala>
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.部分应用(Partial application)你可以使用下划线“”部分应用一个函数,结果将得到另一个函数。Scala 使用下划线表示不同上下文中的不同事物,你通常可以把它看作是一个没有命名的神奇通配符。在{ + 2 }的上下文中,它代表一个匿名参数。
这里我们转载 Twitter 的 Scala 课堂 ,转载的内容基本来自 Twitter 的 Scala 课堂中文翻译,部分有小改动.表达式scala> 1 + 1res0: Int = 2res0 是解释器自动创建的变量名称,用来指代表达式的计算结果。它是 Int 类型,值为2。Scala 中(几乎)一切都是表达式。值你可以给一个表达式的结果起个名字赋成一个不变量(val)。scala>
Scala 语言和其它语言比如 Java 相比,算是一个比较复杂的语言,它是一个面向对象和面向函数的统一体,使用起来非常灵活,因此也不容易掌握,前面的58篇文章仅仅是 Scala 的一个入门教程,有了这些基础知识,你就可以开始编写 Scala 应用,学习一种语言最好的方法是通过实践来学习。适用人群本文着重讲解了 Scala 的 编程,适合中级学者。
我们对前面定义的计算 24 的代码,稍作修改,可以在 Java 中调用,在通常情况下在 Java 中调用 Scala 函数非常简单,反之从 Scala 中调用 Java 代码也很简单,这是因为 Scala 代码最终也要编译成 Java class 文件。以后我们将详细介绍 Java 和 Scala 之间的互操作的用法,这里简要介绍下如何在 Java 代码中调用之前我们定义的计算 24 的算法。
前面我们给出了计算 24 的算法,这并非是计算 24 的 Scala 的最短的代码,除了之前 Scala 二十四点游戏(4):算法之一,在 Scala 中我们还可以使用更简单的方法来计算表达式–从 Scala 2.10.0版本之后,新增了字符串插值的功能,比如: scala> val name = "James"name: String = Jamesscala> println(s"Hello, $name”)sHello, James在字符串前使用 "
关注时代Java