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

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

package com.horstmann.impatient

不同于

package com
package horstmann
package impatient
package a.b.c {
  //串联式包语句
  object cat {
    //一旦使用串联式语句,父包内容不可见
    dog.toString()
    fa.toString()
  }
}
//同一文件定义多个包时,使用{}包起来,否则易出错 
package a.b {
  object fa {}
}
// 文件顶部标记法
package a
package b
package c
//等同于package a.b
// package c
object 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值