快学scala 第6章 对象 读书笔记及习题答案代码
2016-07-21 14:05
393 查看
chapter 6 对象
标签:快学scala
一、笔记
如果一个对象从未被使用,那么其构造器也不会被执行。对象本质上可以拥有类的所有特性,它甚至可以扩展其他类或特质。但不能提供构造器参数。java中通常用到既有实例方法又有静态方法的类,scala中可以通过类与类同名的“伴生”对象来达到同样目的。类与其伴生对象可以互相访问私有特性,必须在同一源文件中。
一个apply方法返回伴生类的对象。Array(100)调用apply(100),输出一个单元素(整数100)的Array[Int]; new Array(100)调用的是构造器this(100),结果时Array[Nothing],包含100个null元素。
class Account private(val id: Int, initialBalance: Double){
private var balance = initialBalance
...
}
object Account{ //伴生对象
def apply(initialBalance: Double) = {
new Account(newUniqueNumber(), initialBalance)
...
}
}
val acct = Account(1000, 0) //调用,构造账户
[/code]
应用程序对象,扩展App特质,加入命令行参数判断
object Hello extends App{
if(args.length > 0)
println("Hello, " + args(0))
else
println("Hello , world !")
}
$ scala -Dscala.time Hello Fread
Hello, Fread
[total 2ms] //显示运行时间
[/code]
scala标准库一个Enumeration助手类,用于产生枚举。
object TrafficLightColor extends Enumeration{
val Red, Yellow, Green = Value
}
[/code]
二、习题答案
6.1 编写一个 Conversions 对象,加入 inchesToCentimeters,gallonsToLiters 和 milesToKilometers 方法object Conversions{
def inchesToCentimeters(value: Double)={ value * 2.54}
def gallonsToLiters(value: Double)= {value * 3.785411}
def milesToKilometers(value: Double){value * 1.609344}
}
[/code]
6.2 前一个练习不是很面向对象。提供一个通用的超类 UnitConversion并定义扩展该超类的 InchesToCentimeters,GallonsToLiters 和 MilesToKilometers 对象
class UnitConversion(val factor: Double){
def convert(value: Double): Double = factor * value
}
object InchesToSantimeters extends UnitConversion(2.54)
object GallonsToLiters extends UnitConversion(3.78541178)
object MilesToKilometers extends UnitConversion(1.609344)
val temperate = InchesToSantimeters(30.0) //调用伴生对象
[/code]
6.3 定义一个扩展自 java.awt.Point 的 Origin对象。为什么说这实际上不是个好主意?(仔细看 Point 类的方法)Point 中的 getLocation 方法返回的是 Point 对象,如果想返回 Origin 对象,需要 Origin 类才行
import java.awt.Point
object Origin extends Point with App{
override def getLocation: Point = super.getLocation
Origin.move(2,3)
println(Origin.toString)
}
[/code]
6.4 定义一个 Point 类和一个伴生对象,使得我们可以不用 new 而直接用 Point(3,4)来构造 Point 实例 apply 方法的使用
class Point(x:Int,y:Int){
override def toString():String = "x = "+x +" y =" +y
}
object Point extends App{
def apply(x: Int, y: Int) = new Point(x,y)
val p = Point(1,2)
println(p)
}
[/code]
6.5 编写一个 Scala 应用程序,使用 App 特质,以反序打印命令行参数,用空格隔开。举例来说,scala Reverse Hello World 应该打印 World Hello
object Reverse extends App{
println(args.reverse.mkString(" "))
}
[/code]
6.6 编写一个扑克牌 4 种花色的枚举,让其 toString 方法分别返回♣,♦,♥,♠
object Suits extends Enumeration{
type Suits = Value
val Spade = Value("♠")
val Club = Value("♣")
val Heart = Value("♥")
val Diamond = Value("♦")
override def toString():String={
Suits.values.mkString(",")
}
}
println(Suits.Club)
println(Suits)
[/code]
6.7 实现一个函数,检查某张牌的花色是否为红色
object suits extends Enumeration with App{
type suits = Value
val Spade = Value("♠")
val Club = Value("♣")
val Heart = Value("♥")
val Diamond = Value("♦")
def isRed(card: suits) = card == Heart || card == Diamond
isRed(suits.Club)
println(isRed(suits.Club))
}
[/code]
6.8 编写一个枚举,描述 RGB 立方体的 8 个角。ID 使用颜色值(例如 :红色是 0xff0000)
object RGBCube extends Enumeration {
val black = Value(0x000000, "Black")
val red = Value(0xff0000, "Red")
val green = Value(0x00ff00, "Green")
val blue = Value(0x0000ff, "Blue")
val yellow = Value(0xffff00, "Yellow")
val magenta = Value(0xff00ff, "Magenta")
val cyan = Value(0x00ffff, "Cyan")
val white = Value(0xffffff, "White")
}
for( c <- RGBCube.values ) println("0x%06x: %s".format(c.id, c))
[/code]
相关文章推荐
- Windows下Scala环境搭建
- Windows7下安装Scala 2.9.2教程
- Scala代码实现列出Hadoop 文件夹下面的所有文件
- ClassNotFoundException:scala.PreDef$
- sbt创建web项目
- XML 文件解析--含Unicode字符的XML文件
- Scala 学习随笔
- Scala 小程序记录(学习期间的代码片段)
- Spark机器学习(二) 局部向量 Local-- Data Types - MLlib
- Spark机器学习(三) Labeled point-- Data Types
- 分分钟掌握快速排序(Java / Scala 实现)
- Scala极速入门
- Spark初探
- Scala实现REST操作
- Scala method call syntax
- 关于Scala多重继承的菱形问题
- Scala 高阶函数(high-order function)剖析
- Scala Monad Design Pattern
- Scala类型系统——高级类类型(higher-kinded types)
- Spray.io搭建Rest服务