《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
19.1
为算术表达式求值器添加/和%操作符。
19.2
为算术表达式求值器添加^操作符。在数学运算当中,^应该比乘法的优先级更高,并且它应该是右结合的。也就是说,4^2^3应该得到4^(2^3),即65536。
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
20.1
编写一个程序,生成由n个随机数组成的数组(其中n是一个很大的值,比如1000000),然后通过将工作分发给多个actor的同时计算这些数的平均值,每个actor计算区间内的值之和,将结果发送给一个能组合出结果的actor。
如果你在双核或四核处理器上运行这个程序,和单线程的解决方案相比,会快多少?
双核上差不多
|
|
20.2
编写一个程序,读取一个大型图片到BufferedImage对象中,用javax.imageio.ImangeIo.read方法。使用多个actor,每一个actor对图形的某一个条带区域进行反色处理。当所有条带都被反色后,输出结果。
|
|
20.3
编写一个程序,对给定目录下所有子目录的所有文件中匹配某个给定的正则表达式的单词进行计数。对每一个文件各采用一个actor,另外再加上一个actor用来遍历所有子目录,还有一个actor将结果汇总到一起。
20.4
修改前一个练习的程序,显示所有匹配的单词。
20.5
修改前一个练习的程序,显示所有匹配的单词,每一个都带有一个包含它的文件的列表。
20.6
编写一个程序,构造100个actor,这些actor使用while(true)/receive循环,当接收到‘Hello消息时,调用println(Thread.currentThread),同时构造另外100个actor,他们做同样的事,不过采用loop/react。将它们全部启动,给它们全部都发送一个消息。第一种actor占用了多少线程,第二种actor占用了多少线程?
20.7
给练习3的程序添加一个监管actor,监控读取文件的actor并记录任何因IOException退出的actor。尝试通过移除那些计划要被处理的文件的方式触发IOException。
20.8
展示一个基于actor的程序是如何在发送同步消息时引发死锁的。
20.9
做出一个针对练习3的程序的有问题的实现,在这个实现当中,actor将更新一个共享的计数器。你能展现出程序运行是错误的吗?
20.10
重写练习1的程序,使用消息通道来进行通信。
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
18.1
实现一个Bug类,对沿着水平线爬行的虫子建模。move方法向当前方向移动,turn方法让虫子转身,show方法打印出当前的位置。让这些方法可以被串接调用。例如:
bugsy.move(4).show().move(6).show().turn().move(5).show()
上述代码应显示4 10 5。
|
|
18.2
为前一个练习中的Bug类提供一个流利接口,达到能编写如下代码的效果:
bugsy move 4 and show and then move 6 and show turn around move 5 and show
|
|
18.3
完成18.1节中的流利接口,以便我们可以做出如下调用:
book set Title to “Scala for the Impatient” set Author to “Cay Horstmann”
|
|
18.4
实现18.2节中被嵌套在Network类中的Member类的equals方法。两个成员要想相等,必须属于同一个网络。
|
|
18.5
考虑如下类型别名
type NetworkMember = n.Member forSome { val n : Network }
和函数
def process(m1: NetworkMember, m2: NetworkMember) = (m1, m2)
这与18.8节中的process函数有什么不同?
与18.8不同,允许不同网络作为参数
18.6
Scala类库中的Either类型可以被用于要么返回结果,要么返回某种失败信息的算法。编写一个带有两个参数的函数:一个已排序整数数组和一个整数值。要么返回该整数值在数组中的下标,要么返回最接近该值的元素的下标。使用一个中置类型作为返回类型。
|
|
18.7
实现一个方法,接受任何具备如下方法的类的对象和一个处理该对象的函数。
调用该函数,并在完成或有任何异常发生时调用close方法。
def close(): Unit
|
|
18.8
编写一个函数printValues,带有三个参数f、from和to,打印出所有给定区间范围内的输入值经过f计算后的结果。这里的f应该是任何带有接受Int产出Int的apply方法的对象。例如:
printValues((x: Int) => x*x, 3, 6) //将打印 9 16 25 36
printValues(Array(1, 1, 2, 3, 5, 8, 13, 21, 34, 55), 3, 6) //将打印 3 5 8 13
|
|
18.9
考虑如下对物理度量建模的类:
abstract class DimT{
protected def create(v: Double): T
def + (other: Dim[T]) = create(value + other.value)
override def toString() = value + “ “ + name
}
以下是具体子类:
class Seconds(v: Double) extends DimSeconds{
override def create(v: Double) = new Seconds(v)
}
但现在不清楚状况的人可能会定义
class Meters(v: Double) extends DimSeconds{
override def create(v: Double) = new Seconds(v)
}
允许米(Meters)和秒(Seconds)相加。使用自身类型来防止发生这样的情况。
|
|
18.10
自身类型通常可以被扩展自身的特质替代,但某些情况下使用自身类型会改变初始化和重写的顺序。构造出这样的一个示例。
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
17.1
定义一个不可变类Pair[T,S], 带一个swap方法,返回组件交换过位置的新对偶
|
|
17.2
定义一个可变类Pair[T],带一个swap方法,交换对偶中组件的位置。
|
|
17.3
给定类Pair[T, S] ,编写一个泛型方法swap,接受对偶作为参数并返回组件交换过位置的新对偶。
|
|
17.4
在17.3节中,如果我们想把Pair[Person]的第一个组件替换成Student,为什么不需要给replaceFirst方法定一个下界?
因为Student是Person的子类,是可以转成T类型的,不必定义下界
17.5
为什么RichInt实现的是Comparable[Int]而不是Comparable[RichInt]?
T <% Comparable[T] ,是隐含参数转化的,T是Int的时候将自动调用RichInt中的Comparable[RichInt]
17.6
编写一个泛型方法middle,返回任何Iterable[T]的中间元素。举例来说,middle(“World”)应得到’r’。
|
|
17.7
查看Iterable[+A]特质。哪些方法使用了类型参数A?为什么在这些方法中类型参数位于协变点?
如min, max, last 等。这些方法都会返回A类型,所以位于协变点。
17.8
在17.10节中,replaceFirst方法带有一个类型界定。为什么你不能对可变的Pair[T]定义一个等效的方法?
def replaceFirstR >: T { first = newFirst } //错误
因为first是子类,newFirst是超类,超类不能被赋值给子类。
17.9
在一个不可变类Pair[+T]中限制方法参数看上去可能有些奇怪。不过,先假定你可以在Pair[+T]定义
def replaceFirst(newFirst: T)
问题在于,该方法可能会被重写(以某种不可靠的方式)。构造出这样的一个示例。定义一个Pair[Double]的类型NastyDoublePair,重写replaceFirst方法,用newFirst的平方根来做新对偶。然后对实际类型为NastyDoublePair的Pair[Any]调用replaceFirst(“Hello”)。
|
|
17.10
给定可变类Pair[S,T],使用类型约束定义一个swap方法,当类型参数相同时可以被调用。
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
实现分布式配置中心:
(1)集中管理外部依赖的服务配置和服务内部配置
(2)提供web管理平台进行配置和查询
(3)支持服务注册与发现
(4)支持客户端拉取配置
(5)支持订阅与发布,配置变更主动通知到client,实时变更配置
备注:client为nodeJS,java等
百度开源
与spring集成的很好,有web管理,client只支持java。
https://github.com/knightliao/disconf/wiki
https://github.com/knightliao/disconf
阿里开源
阿里内部应用广泛,由http server(nameservers), diamond-server ,web组成,diamond-server连接同一个mysql,数据同步通过mysql dump文件同步(同步效率?),支持订阅发布,client只支持java。
http://code.taobao.org/p/diamond/wiki/index/
http://code.taobao.org/svn/diamond/trunk
已停止更新,设计倾向于实时的数据变更通知,数据全部放于内存,不会持久化文件。(有独立工具支持,不知支持性怎样?)
CoreOS开源。
轻量级分布式key-value数据库,同时为集群环境的服务发现和注册而设计。
它提供了数据TTL失效(通过TTL更新来判断机器下线,来避免一定的网络分区问题)、数据改变监视、多值、目录监听、分布式锁原子操作等功能,来管理节点状态。
网上的介绍文章基本停留到稳定版0.4.6上。目前版本已从0.x直接跳到了2.0版本。(2015-1-28)
https://coreos.com/blog/etcd-2.0-release-first-major-stable-release/
2.0介绍(需要翻墙):
https://www.youtube.com/watch?v=z6tjawXZ71E
使用go语言,部署简单,同时项目较年轻。
从实现原理到应用场景多方位解读(2015-1-30)
http://www.infoq.com/cn/articles/etcd-interpretation-application-scenario-implement-principle
https://github.com/coreos/etcd
成熟的分布式配置解决方案,待续。。
Jason Wilder的一篇博客分别对常见的服务发现开源项目Zookeeper、Doozer、etcd进行了总结。
http://jasonwilder.com/blog/2014/02/04/service-discovery-in-the-cloud/
重点关注etcd是否能取代zookeeper。
只从实现语言上考虑,golang性能近c,java在大型集群的多线程能力较好,总体相差不多。都能支持上千节点。
etcd 可以使用递归的Watcher,递归式的监控应用(主题)目录下所有信息的变动。这样就实现了机器IP(消息)变动的时候,能够实时通知到收集器调整任务分配。
递归订阅:
|
|
订阅通知,在/foo-service增加container2,返回:
|
|
更新方式
|
|
get ttl过期的数据,返回errorCode:100
|
|
etcd支持普通节点模式和proxy模式两种:
启动设置集群大小,超过集群大小的etcd节点自动转化为proxy模式。
etcd作为一个反向代理把客户的请求转发给可用的etcd集群。这样,你就可以在每一台机器都部署一个Proxy模式的etcd作为本地服务,如果这些etcd Proxy都能正常运行,那么你的服务发现必然是稳定可靠的。
如图:
etcd特性略胜于zookeeper两点:
(1)etcd在订阅发布机制上能提供的功能与zookeeper相似。但是更轻量级,使用api更简单,依赖少,可直接使用curl/http+json或etcdctl的方式。
(2)etcd的TTL机制能避免一定的网络分区问题(如网络间断误认为注册服务下线)
zookeeper胜于etcd两点:
(1)成熟,稳定性高,多数坑已被踩过。
(2)配套工具:etcd没有web监控平台,client有node-etcd 3.0,较年轻。zookeeper有简单易用的exhibitor监控,java client的curator替代zkclient,非常成熟易用,避免掉坑。
线上已有zookeeper集群,考虑部署成本,避免踩坑,和zookeeper稳定和成熟配套工具,风险等,建议基于zookeeper进行封装开发。
如果小型集群,也是可以尝试etcd,毕竟架构部署简单省事。
参考:
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>实现分布式配置中心:
(1)集中管理外部依赖的服务配置和服务内部配置
(2)提供web管理平台进行配置和查询
(3)支持服务注册与发现
(4)支持客户端拉取配置
(5)支持订阅与发布,配置变更主动]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
16.1
|
|
因为都是scala.xml.Node,是NodeSeq的子类,等同于长度为1的序列。
16.2
如下代码的值是什么?
|
|
花括号作为字面量,需要连写两个
16.3
对比
scala 2.11.4查不到Text api。。略
16.4
读取一个XHTML文件并打印所有不带alt属性的img元素
|
|
16.5
打印XHTML文件中所有图像的名称,即打印所有位于img元素内的src属性值
|
|
16.6
读取XHTML文件并打印一个包含了文件中给出的所有超链接及其url的表格。即,打印所有a元素的child文本和href属性。
|
|
16.7
编写一个函数,带一个类型为Map[String,String]的参数,返回一个dl元素,其中针对映射中每个键对应有一个dt,每个值对应有一个dd,例如:
Map(“A”->”1”,”B”->”2”)
应产出
|
|
16.8
编写一个函数,接受dl元素,将它转成Map[String,String]。该函数应该是前一个练习中的
反向处理,前提是所有dt后代都是唯一的。
|
|
16.9
对一个XHTML文档进行变换,对所有不带alt属性的img元素添加一个alt=”TODO”属性,其他内容完全不变。
|
|
16.10
编写一个函数,读取XHTML文档,执行前一个练习中的变换,并保存结果。确保保留了DTD以及所有CDATA内容。
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
15.1
编写四个JUnit测试用例,分别使用带或不带某个参数的@Test注解。用JUnit执行这些测试
|
|
15.2
创建一个类的示例,展示注解可以出现的所有位置。用@deprecated作为你的示例注解。
|
|
15.3
Scala类库中的哪些注解用到了元注解@param,@field,@getter,@setter,@beanGetter或@beanSetter?
略
15.4
编写一个Scala方法sum,带有可变长度的整型参数,返回所有参数之和。从Java调用该方法。
|
|
15.5
编写一个返回包含某文件所有行的字符串的方法。从Java调用该方法。
|
|
15.6
编写一个Scala对象,该对象带有一个易失(volatile)的Boolean字段。让某一个线程睡眠一段时间,之后将该字段设为true,打印消息,然后退出。而另一个线程不停的检查该字段是否为true。如果是,它将打印一个消息并退出。如果不是,则它将短暂睡眠,然后重试。如果变量不是易失的,会发生什么?
没区别
|
|
15.7
给出一个示例,展示如果方法可被重写,则尾递归优化为非法
|
|
15.8
将allDifferent方法添加到对象,编译并检查字节码。@specialized注解产生了哪些方法?
|
|
javap Test$得到
|
|
15.9
Range.foreach方法被注解为@specialized(Unit)。为什么?通过以下命令检查字节码:
javap -classpath /path/to/scala/lib/scala-library.jar scala.collection.immutable.Range
并考虑Function1上的@specialized注解。点击Scaladoc中的Function1.scala链接进行查看
首先来看Function1的源码
|
|
可以看到Function1参数可以是scala.Int,scala.Long,scala.Float,scala.Double,返回值可以是scala.Unit,scala.Boolean,scala.Int,scala.Float,scala.Long,scala.Double 再来看Range.foreach的源码
|
|
首先此方法是没有返回值的,也就是Unit。而Function1的返回值可以是scala.Unit,scala.Boolean,scala.Int,scala.Float,scala.Long,scala.Double 如果不限定@specialized(Unit),则Function1可能返回其他类型,但是此方法体根本就不返回,即使设置了也无法获得返回值
15.10
添加assert(n >= 0)到factorial方法。在启用断言的情况下编译并校验factorial(-1)会抛异常。在禁用断言的情况下编译。会发生什么?用javap检查该断言调用
|
|
编译报错
|
|
禁用assert
-Xelide-below 2011
反编译此类javap -c Test$ 得到
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
14.1
JDK发行包有一个src.zip文件包含了JDK的大多数源代码。解压并搜索样例标签(用正则表达式case [^:]+:)。然后查找以//开头并包含[Ff]alls?thr的注释,捕获类似// Falls through或// just fall thru这样的注释。假定JDK的程序员们遵守Java编码习惯,在该写注释的地方写下了这些注释,有多少百分比的样例是会掉入到下一个分支的?
略
14.2
利用模式匹配,编写一个swap函数,接受一个整数的对偶,返回对偶的两个组成部件互换位置的新对偶
|
|
14.3
利用模式匹配,编写一个swap函数,交换数组中的前两个元素的位置,前提条件是数组长度至少为2
|
|
14.4
添加一个样例类Multiple,作为Item的子类。举例来说,Multiple(10,Article(“Blackwell Toster”,29.95))描述的是10个烤面包机。当然了,你应该可以在第二个参数的位置接受任何Item,无论是Bundle还是另一个Multiple。扩展price函数以应对新的样例。
|
|
14.5
我们可以用列表制作只在叶子节点存放值的树。举例来说,列表((3 8) 2 (5))描述的是如下这样一棵树:
*
/ | \
|
|
14.6
制作这样的树更好的做法是使用样例类。我们不妨从二叉树开始。
sealed abstract class BinaryTree
case class Leaf(value : Int) extends BinaryTree
case class Node(left : BinaryTree,right : BinaryTree) extends BinaryTree
编写一个函数计算所有叶子节点中的元素之和。
|
|
13.7
扩展前一个练习中的树,使得每个节点可以有任意多的后代,并重新实现leafSum函数。第五题中的树应该能够通过下述代码表示:
Node(Node(Leaf(3),Leaf(8)),Leaf(2),Node(Leaf(5)))
|
|
13.8
扩展前一个练习中的树,使得每个非叶子节点除了后代之外,能够存放一个操作符。然后编写一个eval函数来计算它的值。举例来说:
+
/ | \
|
|
14.9
编写一个函数,计算List[Option[Int]]中所有非None值之和。不得使用match语句。
|
|
14.10
编写一个函数,将两个类型为Double=>Option[Double]的函数组合在一起,产生另一个同样类型的函数。如果其中一个函数返回None,则组合函数也应返回None。例如:
def f(x : Double) = if ( x >= 0) Some(sqrt(x)) else None
def g(x : Double) = if ( x != 1) Some( 1 / ( x - 1)) else None
val h = compose(f,g)
h(2)将得到Some(1),而h(1)和h(0)将得到None
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
13.1
编写一个函数,给定字符串,产出一个包含所有字符的下标的映射。举例来说:indexes(“Mississippi”)应返回一个映射,让’M’对应集{0},’i’对应集{1,4,7,10},依此类推。使用字符到可变集的映射。另外,你如何保证集是经过排序的?
|
|
13.2
重复前一个练习,这次用字符到列表的不可变映射。
|
|
13.3
编写一个函数,从一个整型链表中去除所有的零值。
|
|
13.4
编写一个函数,接受一个字符串的集合,以及一个从字符串到整数值的映射。返回整型的集合,其值为能和集合中某个字符串相对应的映射的值。举例来说,给定Array(“Tom”,”Fred”,”Harry”)和Map(“Tom”->3,”Dick”->4,”Harry”->5),返回Array(3,5)。提示:用flatMap将get返回的Option值组合在一起
|
|
13.5
实现一个函数,作用与mkString相同,使用reduceLeft。
|
|
13.6
给定整型列表lst,(lst :\ ListInt)( :: )得到什么?(ListInt /: lst)( :+ )又得到什么?如何修改它们中的一个,以对原列表进行反向排序?
|
|
13.7
在13.11节中,表达式(prices zip quantities) map { p => p.1 * p._2}有些不够优雅。我们不能用(prices zip quantities) map { },因为 _ 是一个带两个参数的函数,而我们需要的是一个带单个类型为元组的参数的函数,Function对象的tupled方法可以将带两个参数的函数改为以元俎为参数的函数。将tupled应用于乘法函数,以使我们可以用它来映射由对偶组成的列表。
|
|
13.8
编写一个函数。将Double数组转换成二维数组。传入列数作为参数。举例来说,Array(1,2,3,4,5,6)和三列,返回Array(Array(1,2,3),Array(4,5,6))。用grouped方法。
|
|
13.9
Harry Hacker写了一个从命令行接受一系列文件名的程序。对每个文件名,他都启动一个新的线程来读取文件内容并更新一个字母出现频率映射,声明为:
val frequencies = new scala.collection.multable.HashMap[Char,Int] with scala.collection.mutable.SynchronizedMap[Char,Int]
当读到字母c时,他调用
frequencies(c) = frequencies.getOrElse(c,0) + 1
为什么这样做得不到正确答案?如果他用如下方式实现呢:
import scala.collection.JavaConversions.asScalaConcurrentMap
val frequencies:scala.collection.mutable.ConcurrentMap[Char,Int] = new java.util.concurrent.ConcurrentHashMap[Char,Int]
并发问题,并发修改集合不安全。
13.10
Harry Hacker把文件读取到字符串中,然后想对字符串的不同部分用并行集合来并发地更新字母出现频率映射。他用了如下代码:
val frequencies = new scala.collection.mutable.HashMap[Char,Int]
for(c <- str.par) frequencies(c) = frequencies.getOrElse(c,0) + 1
为什么说这个想法很糟糕?要真正地并行化这个计算,他应该怎么做呢?(提示:用aggregate) 并行修改共享变量,结果无法估计。
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
12.1
编写函数values(fun:(Int)=>Int,low:Int,high:Int),该函数输出一个集合,对应给定区间内给定函数的输入和输出。比如,values(x=>x*x,-5,5)应该产出一个对偶的集合(-5,25),(-4,16),(-3,9),…,(5,25)
|
|
12.2
如何用reduceLeft得到数组中的最大元素?
|
|
12.3
用to和reduceLeft实现阶乘函数,不得使用循环或递归
|
|
12.4
前一个实现需要处理一个特殊情况,即n<1的情况。展示如何用foldLeft来避免这个需要。
|
|
12.5
编写函数largest(fun:(Int)=>Int,inputs:Seq[Int]),输出在给定输入序列中给定函数的最大值。举例来说,largest(x=>10x-xx,1 to 10)应该返回25.不得使用循环或递归
|
|
12.6
修改前一个函数,返回最大的输出对应的输入。举例来说,largestAt(fun:(Int)=>Int,inputs:Seq[Int])应该返回5。不得使用循环或递归
|
|
12.7
要得到一个序列的对偶很容易,比如:
val pairs = (1 to 10) zip (11 to 20)
假定你想要对这个序列做某中操作—比如,给对偶中的值求和,但是你不能直接使用:
pairs.map( + )
函数 + 接受两个Int作为参数,而不是(Int,Int)对偶。编写函数adjustToPair,该函数接受一个类型为(Int,Int)=>Int的函数作为参数,并返回一个等效的, 可以以对偶作为参数的函数。举例来说就是:adjustToPair( * )((6,7))应得到42。然后用这个函数通过map计算出各个对偶的元素之和
|
|
12.8
在12.8节中,你看到了用于两组字符串数组的corresponds方法。做出一个对该方法的调用,让它帮我们判断某个字符串数组里的所有元素的长度是否和某个给定的整数数组相对应
|
|
12.9
不使用柯里化实现corresponds。然后尝试从前一个练习的代码来调用。你遇到了什么问题?
没有柯里化则不能使用前一个练习里的代码方式来调用
12.10
实现一个unless控制抽象,工作机制类似if,但条件是反过来的。第一个参数需要是换名调用的参数吗?你需要柯里化吗?
|
|
需要换名和柯里化
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
11.1
根据优先级规则,3 + 4 -> 5和3 -> 4 + 5是如何被求值的?
|
|
11.2
BigInt类有一个pow方法,但没有用操作符字符。Scala类库的设计者为什么没有选用**(像Fortran那样)或者^(像Pascal那样)作为乘方操作符呢?
Scala中的操作符就是方法,其优先级是根据首字母来判断的,优先级如下
最高优先级:除以下字符外的操作符字符
|
|
一般乘方的操作符是优于乘法操作的,如果使用*作为乘方的话,那么其优先级则与相同,而如果使用^的话,则优先级低于*操作。优先级都是有问题的。故没有使用这两种操作符
11.3
实现Fraction类,支持+/操作。支持约分,例如将15/-6变为-5/2。除以最大公约数,像这样:
class Fraction(n:Int,d:Int){
private val num:Int = if(d==0) 1 else n sign(d)/gcd(n,d);
private val den:Int = if(d==0) 0 else d * sign(d)/gcd(n,d);
override def toString = num + “/“ + den
def sign(a:Int) = if(a > 0) 1 else if (a < 0) -1 else 0
def gcd(a:Int,b:Int):Int = if(b==0) abs(a) else gcd(b,a%b)
…
}
|
|
11.4
实现一个Money类,加入美元和美分字段。提供+,-操作符以及比较操作符==和<。举例来说,Money(1,75)+Money(0,50)==Money(2,25)应为true。你应该同时提供*和/操作符吗?为什么?
不需要提供,金额的乘除没有实际意义。
|
|
11.5
提供操作符用于构造HTML表格。例如:Table() | “Java” | “Scala” || “Gosling” | “Odersky” || “JVM” | “JVM,.NET”应产出:
Java | Scala |
Gosling… |
|
|
11.6
提供一个ASCIIArt类,其对象包含类似这样的图形:
/_/\
( ‘ ‘ )
( - )
| | |
(|)
提供将两个ASCIIArt图形横向或纵向结合的操作符。选用适当优先级的操作符命名。纵向结合的实例
/_/\ ——-
( ‘ ‘ ) / Hello \
( - ) < Scala |
| | | \ Coder /
(|) ——-
|
|
11.7
实现一个BigSequence类,将64个bit的序列打包在一个Long值中。提供apply和update操作来获取和设置某个具体的bit
|
|
11.8
提供一个Matrix类—你可以选择需要的是一个22的矩阵,任意大小的正方形矩阵,或mn的矩阵。支持+和操作。操作应同样适用于单值,例如mat*2。单个元素可以通过mat(row,col)得到
|
|
11.9
为RichFile类定义unapply操作,提取文件路径,名称和扩展名。举例来说,文件/home/cay/readme.txt的路径为/home/cay,名称为readme,扩展名为txt
|
|
11.10
为RichFile类定义一个unapplySeq,提取所有路径段。举例来说,对于/home/cay/readme.txt,你应该产出三个路径段的序列:home,cay和readme.txt
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
10.1
java.awt.Rectangle类有两个很有用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这样的类没有。在Scala中,你可以解决掉这个问题。定义一个RenctangleLike特质,加入具体的translate和grow方法。提供任何你需要用来实现的抽象方法,以便你可以像如下代码这样混入该特质:
val egg = new java.awt.geom.Ellipse2D.Double(5,10,20,30) with RectangleLike
egg.translate(10,-10)
egg.grow(10,20)
|
|
10.2
通过把scala.math.Ordered[Point]混入java.awt.Point的方式,定义OrderedPoint类。按辞典编辑方式排序,也就是说,如果x<x’或者x=x’且y<y’则(x,y)<(x’,y’)
|
|
10.3
查看BitSet类,将它的所有超类和特质绘制成一张图。忽略类型参数([…]中的所有内容)。然后给出该特质的线性化规格说明
略
10.4
提供一个CryptoLogger类,将日志消息以凯撒密码加密。缺省情况下密匙为3,不过使用者也可以重写它。提供缺省密匙和-3作为密匙是的使用示例
|
|
10.5
JavaBean规范里有一种提法叫做属性变更监听器(property change listener),这是bean用来通知其属性变更的标准方式。PropertyChangeSupport类对于任何想要支持属性变更通知其属性变更监听器的bean而言是个便捷的超类。但可惜已有其他超类的类—比如JComponent—必须重新实现相应的方法。将PropertyChangeSupport重新实现为一个特质,然后将它混入到java.awt.Point类中
|
|
10.6
在Java AWT类库中,我们有一个Container类,一个可以用于各种组件的Component子类。举例来说,Button是一个Component,但Panel是Container。这是一个运转中的组合模式。Swing有JComponent和JContainer,但如果你仔细看的话,你会发现一些奇怪的细节。尽管把其他组件添加到比如JButton中毫无意义,JComponent依然扩展自Container。Swing的设计者们理想情况下应该会更倾向于图10-4中的设计。但在Java中那是不可能的。请解释这是为什么?Scala中如何用特质来设计出这样的效果?
Java只能单继承。
10.7
市面上有不下数十种关于Scala特质的教程,用的都是些”在叫的狗”啦,”讲哲学的青蛙”啦之类的傻乎乎的例子。阅读和理解这些机巧的继承层级很乏味且对于理解问题没什么帮助,但自己设计一套继承层级就不同了,会很有启发。做一个你自己的关于特质的继承层级,要求体现出叠加在一起的特质,具体的和抽象的方法,以及具体的和抽象的字段
|
|
10.8
在java.io类库中,你可以通过BufferedInputStream修饰器来给输入流增加缓冲机制。用特质来重新实现缓冲。简单起见,重写read方法
|
|
10.9
使用本章的日志生成器特质,给前一个练习中的方案增加日志功能,要求体现缓冲的效果
|
|
10.10
实现一个IterableInputStream类,扩展java.io.InputStream并混入Iterable[Byte]特质
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
9.1
编写一小段Scala代码,将某个文件中的行倒转顺序(将最后一行作为第一行,依此类推)
|
|
9.2
编写Scala程序,从一个带有制表符的文件读取内容,将每个制表符替换成一组空格,使得制表符隔开的n列仍然保持纵向对齐,并将结果写入同一个文件
|
|
9.3
编写一小段Scala代码,从一个文件读取内容并把所有字符数大于12的单词打印到控制台。如果你能用单行代码完成会有额外奖励
|
|
9.4
编写Scala程序,从包含浮点数的文本文件读取内容,打印出文件中所有浮点数之和,平均值,最大值和最小值
|
|
9.5
编写Scala程序,向文件中写入2的n次方及其倒数,指数n从0到20。对齐各列:
1 1
2 0.5
4 0.25
… …
|
|
9.6
编写正则表达式,匹配Java或C++程序代码中类似”like this,maybe with \” or\“这样的带引号的字符串。编写Scala程序将某个源文件中所有类似的字符串打印出来
|
|
9.7
编写Scala程序,从文本文件读取内容,并打印出所有的非浮点数的词法单位。要求使用正则表达式
|
|
9.8
编写Scala程序打印出某个网页中所有img标签的src属性。使用正则表达式和分组
|
|
9.9
编写Scala程序,盘点给定目录及其子目录中总共有多少以.class为扩展名的文件
|
|
9.10
扩展那个可序列化的Person类,让它能以一个集合保存某个人的朋友信息。构造出一些Person对象,让他们中的一些人成为朋友,然后将Array[Person]保存到文件。将这个数组从文件中重新读出来,校验朋友关系是否完好
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
8.1
扩展如下的BankAccount类,新类CheckingAccount对每次存款和取款都收取1美元的手续费
class BankAccount(initialBalance:Double){
private var balance = initialBalance
def deposit(amount:Double) = { balance += amount; balance}
def withdraw(amount:Double) = {balance -= amount; balance}
}
|
|
8.2
扩展前一个练习的BankAccount类,新类SavingsAccount每个月都有利息产生(earnMonthlyInterest方法被调用),并且有每月三次免手续费的存款或取款。在earnMonthlyInterest方法中重置交易计数。
|
|
8.3
翻开你喜欢的Java或C++教科书,一定会找到用来讲解继承层级的实例,可能是员工,宠物,图形或类似的东西。用Scala来实现这个示例。
|
|
8.4
定义一个抽象类Item,加入方法price和description。SimpleItem是一个在构造器中给出价格和描述的物件。利用val可以重写def这个事实。Bundle是一个可以包含其他物件的物件。其价格是打包中所有物件的价格之和。同时提供一个将物件添加到打包当中的机制,以及一个适合的description方法
|
|
8.5
设计一个Point类,其x和y坐标可以通过构造器提供。提供一个子类LabeledPoint,其构造器接受一个标签值和x,y坐标,比如:new LabeledPoint(“Black Thursday”,1929,230.07)
|
|
8.6
定义一个抽象类Shape,一个抽象方法centerPoint,以及该抽象类的子类Rectangle和Circle。为子类提供合适的构造器,并重写centerPoint方法
|
|
8.7
提供一个Square类,扩展自java.awt.Rectangle并且是三个构造器:一个以给定的端点和宽度构造正方形,一个以(0,0)为端点和给定的宽度构造正方形,一个以(0,0)为端点,0为宽度构造正方形
|
|
8.8
编译8.6节中的Person和SecretAgent类并使用javap分析类文件。总共有多少name的getter方法?它们分别取什么值?(提示:可以使用-c和-private选项)
总共两个。Person中取得的是传入的name,而SecretAgent中取得的是默认的”secret”
8.9
在8.10节的Creature类中,将val range替换成一个def。如果你在Ant子类中也用def的话会有什么效果?如果在子类中使用val又会有什么效果?为什么?
在Ant中使用def没有问题。但是如果使用val则无法编译。因为val只能重写不带参数的def。这里的def是带参数的
8.10
文件scala/collection/immutable/Stack.scala包含如下定义:
class Stack[A] protected (protected val elems: List[A])
请解释protected关键字的含义。(提示:回顾我们在第5章中关于私有构造器的讨论) 此构造方法只能被其子类来调用,而不能被外界直接调用
此构造方法只能被其子类来调用,而不能被外界直接调用
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
7.1
编写示例程序,展示为什么
package com.horstmann.impatient
不同于
package com
package horstmann
package impatient
|
|
7.2
编写一段让你的Scala朋友们感到困惑的代码,使用一个不在顶部的com包
|
|
7.3
编写一个包random,加入函数nextInt():Int,nextDouble():Double,setSeed(seed:Int):Unit。生成随机数的算法采用线性同余生成器
|
|
7.4
在你看来Scala的设计者为什么要提供package object语法而不是简单的让你将函数和变量添加到包中呢?
JVM不支持
7.5
private[com] def giveRaise(rate:Double)的含义是什么?有用吗?
除了com包可访问giveRaise,其他包都不能访问。有用。
7.6
编写一段程序,将Java哈希映射中的所有元素拷贝到Scala哈希映射。用引入语句重命名这两个类。
|
|
7.7
在前一个练习中,将所有引入语句移动到尽可能小的作用域里
|
|
7.8
以下代码的作用是什么?这是个好主意吗?
import java.
import javax.
导入java和javax下的所有类。而java和javax下是没有类的。所以此代码无用
7.9
编写一段程序,引入java.lang.System类,从user.name系统属性读取用户名,从Console对象读取一个密码,如果密码不是”secret”,则在标准错误流中打印一个消息;如果密码是”secret”,则在标准输出流中打印一个问候消息。不要使用任何其他引入,也不要使用任何限定词(带句点的那种)
|
|
7.10
除了StringBuilder,还有哪些java.lang的成员是被scala包覆盖的?
比对java.lang下的类和scala包下的类,略
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
6.1
编写一个 Conversions 对象,加入 inchesToCentimeters,gallonsToLiters 和 milesToKilometers 方法
|
|
6.2
前一个练习不是很面向对象。提供一个通用的超类 UnitConversion并定义扩展该超类的 InchesToCentimeters,GallonsToLiters 和 MilesToKilometers 对象
|
|
6.3
定义一个扩展自 java.awt.Point 的 Origin 对象。为什么说这实际上不是个好主意?(仔细看 Point 类的方法)Point 中的 getLocation 方法返回的是 Point 对象,如果想返回 Origin 对象,需要 Origin 类才行
|
|
6.4
定义一个 Point 类和一个伴生对象,使得我们可以不用 new 而直接用 Point(3,4)来构造 Point 实例 apply 方法的使用
|
|
6.5
编写一个 Scala 应用程序,使用 App 特质,以反序打印命令行参数,用空格隔开。举例来说,scala Reverse Hello World 应该打印 World Hello
|
|
6.6
编写一个扑克牌 4 种花色的枚举,让其 toString 方法分别返回♣,♦,♥,♠
|
|
6.7
实现一个函数,检查某张牌的花色是否为红色
|
|
6.8
编写一个枚举,描述 RGB 立方体的 8 个角。ID 使用颜色值(例如 :红色是 0xff0000)
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
5.1
改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数
答:
|
|
5.2
编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性
答:
|
|
5.3
编写一个Time类,加入只读属性hours和minutes,和一个检查某一时刻是否早于另一时刻的方法before(other:Time):Boolean。Time对象应该以new Time(hrs,min)方式构建。其中hrs以军用时间格式呈现(介于0和23之间)
答:
|
|
5.4
重新实现前一个类中的Time类,将内部呈现改成午夜起的分钟数(介于0到24*60-1之间)。不要改变公有接口。也就是说,客户端代码不应因你的修改而受影响
答:
|
|
5.5
创建一个Student类,加入可读写的JavaBeans属性name(类型为String)和id(类型为Long)。有哪些方法被生产?(用javap查看。)你可以在Scala中调用JavaBeans的getter和setter方法吗?应该这样做吗?
答:
|
|
5.6
在5.2节的Person类中提供一个主构造器,将负年龄转换为0
答:
|
|
5.7
编写一个Person类,其主构造器接受一个字符串,该字符串包含名字,空格和姓,如new Person(“Fred Smith”)。提供只读属性firstName和lastName。主构造器参数应该是var,val还是普通参数?为什么?
答:
|
|
5.8
创建一个Car类,以只读属性对应制造商,型号名称,型号年份以及一个可读写的属性用于车牌。提供四组构造器。每个构造器fc都要求制造商和型号为必填。型号年份和车牌可选,如果未填,则型号年份为-1,车牌为空串。你会选择哪一个作为你的主构造器?为什么?
答:
|
|
5.9
在Java,C#或C++重做前一个练习。Scala相比之下精简多少?
答:
略
5.10
考虑如下的类
class Employ(val name:String,var salary:Double){
def this(){this(“John Q. Public”,0.0)}
}
重写该类,使用显示的字段定义,和一个缺省主构造器。你更倾向于使用哪种形式?为什么?
答:
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
4.1
设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后构建另一个映射,采用同一组键,但是价格上打9折
答:
|
|
4.2
编写一段程序,从文件中读取单词。用一个可变映射来清点每个单词出现的频率。读取这些单词的操作可以使用java.util.Scanner
答:
|
|
4.3
重复前一个练习,这次用不可变的映射
答:
|
|
4.4
重复前一个练习,这次使用已排序的映射,以便单词可以按顺序打印出来
答:
|
|
4.5
重复前一个练习,这次使用java.util.TreeMap并使之适用于Scala API
答:
|
|
4.6
定义一个链式哈希映射,将”Monday”映射到java.util.Calendar.MONDAY,依次类推加入其他日期。展示元素是以插入的顺序被访问的
答:
|
|
4.7
打印出所有Java系统属性的表格
答:
|
|
4.8
编写一个函数minmax(values:Array[Int]),返回数组中最小值和最大值的对偶
答:
|
|
4.9
编写一个函数Iteqgt(values:Array[int],v:Int),返回数组中小于v,等于v和大于v的数量,要求三个值一起返回
答:
|
|
4.10
当你将两个字符串拉链在一起,比如”Hello”.zip(“World”),会是什么结果?想出一个讲得通的用例
答:
|
|
StringOps中的zip定义如下:
abstract def zipB: StringOps[(A, B)]
GenIterable是可遍历对象需要包含的trait,对于String来说,它是可遍历的。但是它的遍历是遍历单个字母。 所以拉链就针对每个字母来进行。
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
3.1
编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间
答:
|
|
3.2
编写一个循环,将整数数组中相邻的元素置换。例如,Array(1,2,3,4,5)经过置换后变为Array(2,1,4,3,5)
答:
|
|
3.3
重复前一个练习,不过这一次生成一个新的值交换过的数组。用for/yield
答:
|
|
3.4
给定一个整数数组,产生一个新的数组,包含元数组中的所有正值,以原有顺序排列,之后的元素是所有零或负值,以原有顺序排列
答:
|
|
3.5
如何计算Array[Double]的平均值
答:
|
|
3.6
如何重新组织Array[Int]的元素将他们以反序排列?对于ArrayBuffer[Int]你又会怎么做呢?
答:
|
|
3.7
编写一段代码,产出数组中的所有值,去掉重复项。(提示:查看Scaladoc)
|
|
3.9
创建一个由java.util.TimeZone.getAvailableIDs返回ide时区集合,判断条件是它们在美洲。去掉”America/“前缀并排序
答:
|
|
3.10
引入java.awt.datatransfer.并构建一个类型为SystemFlavorMap类型的对象:
val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]
然后以DataFlavor.imageFlavor为参数调用getNativesForFlavor方法,以Scala缓冲保存返回值。
(为什么用这样一个晦涩难懂的类?因为在Java标准库中很难找到使用java.util.List的代码)
答:
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>
《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
2.1
一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0,则signum为0.编写一个函数来计算这个值。
答:
|
|
2.2
一个空的块表达式{}的值是什么?类型是什么?
答:
|
|
2.3
指出在Scala中何种情况下赋值语句x=y=1是合法的。(提示:给x找个合适的类型定义)
答:
因为赋值语句的值是Unit型,所以x可定义为Unit型。
|
|
2.4
针对下列Java循环编写一个Scala版本:
for(int i=10;i>=0;i—) System.out.println(i);
答:
|
|
2.5
编写一个过程countdown(n:Int),打印从n到0的数字。
答:
|
|
2.6
编写一个for循环,计算字符串中所有字母的Unicode代码的乘积。举例来说,”Hello”中所有字符串的乘积为9415087488L
答:
|
|
2.7
同样是解决前一个练习的问题,但这次不使用循环。(提示:在Scaladoc中查看StringOps)
答:
|
|
2.8
编写一个函数product(s:String), 计算前面习题中提到的乘积。
答:
|
|
2.9
把前一个练习中的函数改成递归函数。
答:
|
|
2.10
编写函数计算x^n, 其中n为整数。使用如下的递归定义:
答:
|
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)
]]>《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
<]]>