快学scala 第七章 包和引入 读书笔记及习题答案代码

chapter 7 包和引入

标签:快学scala


一、笔记

  1. scala中的包名是相对的,源文件的目录与包之间没有强制的关联关系,完全可以在同一文件中为多个包贡献内容。 
    包可以包含类、对象和特质,但是不能包含函数和变量的定义,这是java虚拟机的局限,但是包对象package object可以。
  2. 当引入包的几个成员,使用选取器(selector) 
    import java.util.(HashMap => JavaHashMap) 
    import scala.collection.mutable._

二、习题答案

7.1 编写示例程序,展示为什么 
package com.horstmann.impatient 
不同于 
package com 
package horstmann 
package impatient

 
 
  1. package com{
  2. class T1(){}
  3. package horstmann{
  4. class T2(){}
  5. package impatient{
  6. class T3(){}
  7. }
  8. }
  9. }
  10. package com.horstmann.impatient{
  11. class T4(t1: T1, t2: T2) //not found T1 T2
  12. }

7.2 编写一段让你的Scala朋友们感到困惑的代码,使用一个不在顶部的com包

 
 
  1. package horstmann{
  2. class T1(){}
  3. package com{
  4. class T2(t: T1){}
  5. }
  6. package impatient{
  7. class aT3(t1: T1, t2: com.T2){}
  8. }
  9. }

7.3 编写一个包random,加入函数nextInt():Int,nextDouble():Double,setSeed(seed:Int):Unit。生成随机数的算法采用线性同余生成器

 
 
  1. package object random{
  2. var seed: Int = _
  3. val a = BigDecimal(1664525)
  4. val b = BigDecimal(1013904223)
  5. val n = 32
  6. def nextInt(): Int={
  7. val temp = (seed *a + b) % BigDecimal(2).pow(n)
  8. seed = temp.toInt
  9. seed
  10. }
  11. def nextDouble(): Double={
  12. val temp = (seed *a + b) % BigDecimal(2).pow(n)
  13. seed = temp.toInt
  14. temp.toDouble
  15. }
  16. }
  17. import random._
  18. object test extends App{
  19. (1 to 10).foreach(x => println(nextInt()))
  20. (1 to 10).foreach(x => println(nextDouble()))
  21. }

7.4 在你看来Scala的设计者为什么要提供package object语法而不是简单的让你将函数和变量添加到包中呢? 
因为JVM不支持包中包含函数和变量

7.5 private[com] def giveRaise(rate:Double)的含义是什么?有用吗?

除了com包可访问giveRaise,其他包都不能访问。有用。

7.6 编写一段程序,将Java哈希映射中的所有元素拷贝到Scala哈希映射。用引入语句重命名这两个类。

 
 
  1. object Transfer extends App{
  2. import java.util.{HashMap => JavaHashMap}
  3. import collection.mutable.{HashMap => ScalaHashMap}
  4. val javaMap = new JavaHashMap[Int, String]
  5. javaMap.put(1, "One");
  6. javaMap.put(2, "Two");
  7. javaMap.put(3, "Three");
  8. javaMap.put(4, "Four");
  9. val scalaMap = new ScalaHashMap[Int, String]
  10. for(key <- javaMap.keySet().toArray){
  11. scalaMap+= (key.asInstanceOf[Int] -> javaMap.get(key))
  12. }
  13. println(scalaMap.mkString(" "))
  14. }

7.7 在前一个练习中,将所有引入语句移动到尽可能小的作用域里

 
 
  1. object Transfer extends App{
  2. import java.util.{HashMap => JavaHashMap}
  3. val javaMap = new JavaHashMap[Int, String]
  4. javaMap.put(1, "One");
  5. javaMap.put(2, "Two");
  6. javaMap.put(3, "Three");
  7. javaMap.put(4, "Four");
  8. import collection.mutable.{HashMap => ScalaHashMap}
  9. val scalaMap = new ScalaHashMap[Int, String]
  10. for(key <- javaMap.keySet().toArray){
  11. scalaMap+= (key.asInstanceOf[Int] -> javaMap.get(key))
  12. }
  13. println(scalaMap.mkString(" "))
  14. }

7.8 以下代码的作用是什么?这是个好主意吗? 
import java. 
import javax.

导入java和javax下的所有类。而java和javax下是没有类的。所以此代码无用

7.9 编写一段程序,引入java.lang.System类,从user.name系统属性读取用户名,从Console对象读取一个密码,如果密码不是”secret”,则在标准错误流中打印一个消息;如果密码是”secret”,则在标准输出流中打印一个问候消息。不要使用任何其他引入,也不要使用任何限定词(带句点的那种)

 
 
  1. import java.lang.System._
  2. object vertify extends App{
  3. var password = Console.readLine()
  4. if(password equals "secret")
  5. println("Hello " + getProperty("user.name"))
  6. else
  7. println("password error!")
  8. }

7.10 除了StringBuilder,还有哪些java.lang的成员是被scala包覆盖的?

直接比对java.lang下的类和scala包下的类即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值