快學Scala習題解答—第七章 包和引入

[size=large][b]8 包和引入[/b][/size]
[b]8.1 編寫示例程序,展示爲什麼
package com.horstmann.impatient
不同於
package com
package horstmann
package impatient[/b]
分別使用package的效果如下
package com {
class T1() {}

package horstmann {
class T2(t: T1) {}

package impatient {
class T3(t1: T1, t2: T2) {}
}
}
}

子包裏的類可以使用父包裏的類。但是第一種方式不可以
package com.horstmann.impatient{
class T4(t1:T1,t3:T3) //無法找到T1
}


[b]8.2 編寫一段讓你的Scala朋友們感到困惑的代碼,使用一個不在頂部的com包
這樣可以嗎?[/b]
package com {
class T1() {}

package horstmann {
class T2(t: T1) {}

package impatient {
class T3(t1: T1, t2: T2) {}
}
}
}

import com._

class TT(t1:T1){

}


[b]8.3 編寫一個包random,加入函數nextInt():Int,nextDouble():Double,setSeed(seed:Int):Unit。生成隨機數的算法採用線性同餘生成器:
後值 = (前值 * a + b)mod 2^n
其中,a = 1664525,b=1013904223,n = 32,前值的初始值爲seed[/b]
package random{
package object random{

var seed:Int = _
val a = BigDecimal(1664525)
val b = BigDecimal(1013904223)
val n = 32


def nextInt():Int={
val temp = (seed * a + b) % BigDecimal(2).pow(n)
seed = temp.toInt
seed
}

def nextDouble():Double={
val temp = (seed * a + b) % BigDecimal(2).pow(n)
seed = temp.toInt
temp.toDouble
}
}
}

package test {
import random.random

object Test extends App {
random.seed = 4
println(random.nextDouble())
println(random.nextDouble())
println(random.nextDouble())
println(random.nextDouble())
println(random.nextInt())
println(random.nextInt())
println(random.nextInt())
println(random.nextInt())
}

}


[b]8.4 在你看來Scala的設計者爲什麼要提供package object語法而不是簡單的讓你將函數和變量添加到包中呢?[/b]
JVM不支持。。。

[b]8.5 private[com] def giveRaise(rate:Double)的含義是什麼?有用嗎?[/b]
除了com包可訪問,其他包都不能訪問。

[b]8.6 編寫一段程序,將Java哈希映射中的所有元素拷貝到Scala哈希映射。用引入語句重命名這兩個類。[/b]
import java.util.{HashMap => JavaHashMap}
import scala.collection.mutable.HashMap

object Test extends App{

val map = new JavaHashMap[String,String]()
map.put("1","a")
map.put("2","b")
map.put("3","c")

val smap = new HashMap[String,String]()

for(key <- map.keySet().toArray){
smap += (key.toString -> map.get(key))
}

println(smap.mkString)
}


[b]8.7 在前一個練習中,將所有引入語句移動到儘可能小的作用域裏[/b]
object Test extends App{

import java.util.{HashMap => JavaHashMap}

val map = new JavaHashMap[String,String]()
map.put("1","a")
map.put("2","b")
map.put("3","c")

import scala.collection.mutable.HashMap

val smap = new HashMap[String,String]()

for(key <- map.keySet().toArray){
smap += (key.toString -> map.get(key))
}

println(smap.mkString)
}


[b]8.8 以下代碼的作用是什麼?這是個好主意嗎?
import java._
import javax._[/b]
導入java和javax下的所有類。而java和javax下是沒有類的。所以此代碼無用

[b]8.9 編寫一段程序,引入java.lang.System類,從user.name系統屬性讀取用戶名,從Console對象讀取一個密碼,如果密碼不是"secret",則在標準錯誤流中打印一個消息;如果密碼是"secret",則在標準輸出流中打印一個問候消息。不要使用任何其他引入,也不要使用任何限定詞(帶句點的那種)[/b]
import java.lang.System

object Test extends App{
var password = Console.readLine()

if (password equals "secret") System.out.println("Hello " + System.getProperty("user.name"))
else System.err.println("password error!")
}


[b]8.10 除了StringBuilder,還有哪些java.lang的成員是被scala包覆蓋的?[/b]
直接比對java.lang下的類和scala包下的類即可

[b]Blog Url:[/b][url]http://www.ivanpig.com/blog/?p=472[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章