《快学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的封装,应该能从专门技术文档下查到,逐个对比,不太现实
- 《快学Scala》习题详解 第7章 包
- 《快学scala》习题详解 第1章 基础
- 《快学Scala》习题详解 第3章 数组
- 《快学Scala》习题详解 第5章 类
- 《快学Scala》习题详解 第6章 对象
- 《快学Scala》习题详解 第8章 继承
- 《快学Scala》习题详解 第10章 特质
- 《快学Scala》习题详解 第11章 操作符
- 《快学Scala》第7章 包和引入 练习
- 快学Scala第7章----包和引入
- 快学scala习题(七)-----包
- 《快学Scala》习题详解 第2章 控制结构和函数
- 《快学Scala》习题详解 第4章 映射和元组
- 《快学Scala》习题详解 第9章 文件和正则
- 《快学Scala》习题详解 第12章 高阶函数
- 快学Scala 第三章习题答案
- 快学Scala 第四章习题答案
- 快学Scala 第六章习题答案
- mybatis使用PageHelper实现分页的技术
- Windows环境下使用 Caffe在ImageNet上训练网络
- Applet原理及一个简单DEMO
- 用gem install jekyll命令安装jekyll错误 ERROR: Failed to build gem native extension
- Thinking in C++(1)
- 《快学Scala》习题详解 第7章 包
- JDBC中大文本类型的处理
- Spark core 核心算子优化
- jsp的9大内置对象
- IntelliJ IDEA 2017激活码
- Java 并发编程实战之 基础构建模块
- mmu地址映射
- C语言 strspn函数实现
- linux命令行下文件名中有空格如何处理