Scala for the Impatient Chapter 7 练习
第1题
编写示例程序,展示为什么
1 | package com.horstmann.impatient |
不同于
1 | package com |
主要区别在于包的可见性不同,后者上层包也可见,而串写以后只要当前的包可见,即只有 impatient 包是可见的。
示例代码如下:
1 | package excercises.chapter7 |
运行结果如下:
1 | [info] Running excercises.chapter7.com.horstmann.impatient.B |
如果代码修改如下:
1 | package excercises.chapter7 |
则会编译错误:
1 | [error] A.hello |
此时,IDE 的提示如下:

显然,当前的只有impatient 包是可见的,上层的 horstmann 里面的内容并不可见,正确的修改后的能够运行的代码应该是这样的:
1 | package excercises.chapter7 |
执行结果如下:
1 | [info] Running excercises.chapter7.com.horstmann.impatient.C |
第2题
编写一段让你的 Scala 朋友们感到困惑的代码,使用一个不在顶部的 com 包。
编写两段代码,a2.scala:
1 | package excercises.chapter7 |
b2.scala:
1 | package excercises.chapter7 |
在IDE 集成环境当中 sbt 编译后的运行结果如下:
1 | [info] Running excercises.chapter7.com.horstmann.impatient.B2 |
手动编译,先编译b2.scala,再编译a2.scala,然后再运行,结果如下:
1 | scalac b2.scala |
如果先编译b2,则 B2会调用同文件当中的 com.horstmann包中的 A2对象,如果先编译 a2,则 a2.scala文件当中的com.horstmann.A2会被调用。
第3题
编写一个包 random,加入函数 nextInt(): Int、nextDouble(): DoubleHesetSeed(seed: Int): Unit。生成随机数的算法采用线性同余生成器:
后值=(前值 *a+b)mod2^2$$其中,
本题中1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35package excercises.chapter7
package random {
object Random{
private val a: Int = 1664525
private val b: Int = 1013904223
private val n: Int = 32
private var seed: Int = 0
private var current: BigInt = 0
private var next: BigInt = 0
def nextInt(): Int = {
next = (current * a + b) % BigInt(math.pow(2, n).toLong)
current = next
(next % BigInt(math.pow(2, n).toLong)).intValue() //Converts this BigDecimal to an Int. If the BigDecimal is too big to fit in an Int, only the low-order 32 bits are returned.
}
def nextDouble(): Double = {
nextInt().toDouble
}
def setSeed(newSeed: Int): Unit = {
seed = newSeed
current = seed
}
}
}
object randomTest extends App{
var r = random.Random
r.setSeed(args(0).toInt)
for(i <- 1 to 10) println(r.nextInt())
for(i <- 1 to 10) println(r.nextDouble())
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22[info] Running excercises.chapter7.randomTest 10
1030549473
797165516
-1431871301
163339998
209336485
424841664
-1485645281
-852270862
-1739764823
671228148
1.434441667E9
-1.779459514E9
1.642573037E9
1.73212708E9
1.245609383E9
7.54638554E8
1.027678321E9
1.991483164E9
1.588539339E9
-2.09385813E9
[success] Total time: 8 s, completed Apr 26, 2019 5:48:35 PM1
private[com] def giveRaise(rate: Double)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package excercises.chapter7
import java.util.{HashMap => JavaHashMap}
import scala.collection.mutable.{HashMap => ScalaHashMap}
object JMapToSMap extends App {
def mapTranster (javaMap: JavaHashMap[Any, Any]): ScalaHashMap[Any, Any] = {
val result: ScalaHashMap[Any, Any] = new ScalaHashMap[Any, Any]
for (k <- javaMap.keySet().toArray()){
result += k -> javaMap.get(k)
}
result
}
val javaMap: JavaHashMap[Any, Any] = new JavaHashMap[Any, Any]
var scalaMap: ScalaHashMap[Any, Any] = new ScalaHashMap[Any, Any]
for (i <- 1 to 10)
javaMap.put(i, "JavaMap" + i)
scalaMap = mapTranster(javaMap)
scalaMap foreach println
}1
2
3
4
5
6
7
8
9
10
11
12[info] Running excercises.chapter7.JMapToSMap
(8,JavaMap8)
(2,JavaMap2)
(5,JavaMap5)
(4,JavaMap4)
(7,JavaMap7)
(10,JavaMap10)
(1,JavaMap1)
(9,JavaMap9)
(3,JavaMap3)
(6,JavaMap6)
[success] Total time: 9 s, completed Apr 26, 2019 7:26:01 PM1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package excercises.chapter7
object JMapToSMap extends App {
import java.util.{HashMap => JavaHashMap}
import scala.collection.mutable.{HashMap => ScalaHashMap}
def mapTranster (javaMap: JavaHashMap[Any, Any]): ScalaHashMap[Any, Any] = {
val result: ScalaHashMap[Any, Any] = new ScalaHashMap[Any, Any]
for (k <- javaMap.keySet().toArray()){
result += k -> javaMap.get(k)
}
result
}
val javaMap: JavaHashMap[Any, Any] = new JavaHashMap[Any, Any]
var scalaMap: ScalaHashMap[Any, Any] = new ScalaHashMap[Any, Any]
for (i <- 1 to 10)
javaMap.put(i, "JavaMap" + i)
scalaMap = mapTranster(javaMap)
scalaMap foreach println
}1
2
3
4
5
6
7
8
9
10
11
12[info] Running excercises.chapter7.JMapToSMap
(8,JavaMap8)
(2,JavaMap2)
(5,JavaMap5)
(4,JavaMap4)
(7,JavaMap7)
(10,JavaMap10)
(1,JavaMap1)
(9,JavaMap9)
(3,JavaMap3)
(6,JavaMap6)
[success] Total time: 5 s, completed Apr 26, 2019 7:32:09 PM1
2import java._
import javax._1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package excercises.chapter7
import java.lang.System._
import scala.io.StdIn
object Sys extends App {
val pass=StdIn.readLine()
if(pass == "secret"){
val username = getProperty("user.name")
out.printf("Greetings,%s!", username)
println()
}else{
err.println("error")
}
}```
运行结果如下:
```scala
[info] Running excercises.chapter7.Sys
Greetings,datacruiser!
[success] Total time: 6 s, completed Apr 26, 2019 7:58:33 PM