《快学Scala》习题详解 第7章 包

来源:互联网 发布:discuz源码有多大 编辑:程序博客网 时间:2024/05/17 00:11

1 编写示例程序,展示为什么

package com.horstmann.impatient

不同于

package compackage horstmannpackage impatient
package a.b.c {  //串联式包语句  object cat {    //一旦使用串联式语句,父包内容不可见    dog.toString()    fa.toString()  }}//同一文件定义多个包时,使用{}包起来,否则易出错 package a.b {  object fa {}}
// 文件顶部标记法package apackage bpackage c//等同于package a.b// package cobject dog {  cat.toString()  fa.toString() //上一级包中的内容可见}

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

object cat {  //可在任何地方引入,不限于顶部,作用效果作该语句块的末端  import a.b._  fa.toString()}package a.b {  object fa {}}

3 编写一个包random,加入函数nextInt():Int,nextDouble():Double,setSeed(seed:Int):Unit。生成随机数的算法采用线性同余生成器:
后值 = (前值 * a + b)mod 2^n
其中,a = 1664525,b=1013904223,n = 32,前值的初始值为seed
网上的答案基本都是错误的,压根不是同余法
以下是Java中随机数的生成,改成scala太费时就不改了,而且scala生成随机数,底层就是调用Java的Random
包对象中不能使用main/App,定义了也不会执行

    protected int next(int bits) {        long oldseed, nextseed;        AtomicLong seed = this.seed;        do {            oldseed = seed.get();            nextseed = (oldseed * multiplier + addend) & mask;        } while (!seed.compareAndSet(oldseed, nextseed));        return (int)(nextseed >>> (48 - bits));    }

4 在你看来Scala的设计者为什么要提供package object语法而不是简单的让你将函数和变量添加到包中呢?
因为JVM不支持包中包含函数和变量
放在同一个object中,同时便于管理

5 private[com] def giveRaise(rate:Double)的含义是什么?有用吗?
包的可见性,没有被声明为public/private/protected的类成员在包含该类的包中可见
private[com],将类成员的可见度延展到上层包com,即可以使用giveRaise方法

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

  import java.util.{ HashMap => M1 }  import scala.collection.mutable.{ HashMap => M2 }  val m1 = new M1[String, Integer]  m1.put("a", 1)  m1.put("b", 2)  m1.put("c", 2)  val m2 = new M2[String, Int]  for (key <- m1.keySet().toArray()) {    m2 += (key.toString() -> m1.get(key).toInt)  }  for ((k, v) <- m2) println(k + ":" + v)

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

8 以下代码的作用是什么?这是个好主意吗?
import java._
import javax._
导入java与javax包中所有成员,不好,包中内容会冲突,但包下面全为子包

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

  //java.lang._默认导入  val password = Console.readLine()  if (password == "secret") println("Hello " + System.getProperty("user.name"))  else println("error")

10 除了StringBuilder,还有哪些java.lang的成员是被scala包覆盖的?
scala中,比如基本数据类型,String
scala有很多语法都是对Java的封装,应该能从专门技术文档下查到,逐个对比,不太现实

0 0
原创粉丝点击