快学scala 第一章 读书笔记及习题答案代码
2016-07-11 08:41
435 查看
chapter 1 scala基础
标签:快学scala《快学scala》原书《scala for the Impatient》
一、笔记
技术上讲,scala程序并不是一个解释器。实际发生的是,输入的内容被编译成字节码,然后字节码交由Java虚拟机执行。 不需要给出值或变量的类型,这个信息可以从你用来初始化它的表达式推断出来。但是,声明值和变量一定要初始化。
变量和函数的类型总是在变量和函数名称后面,也不用使用分号,只有当同一行代码存在多条语句时才需要‘;’
val greeting: String = null
val greeting: Any = "Hello"
scala中Byte、Char、Short、Int、Long、Float、Double和Boolean这些类型都是类。scala并不刻意区分基本类型和引用类型。比如
1.toString() //产生字符串“1”
1.to(10) //产生Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),Int先转换成RichInt,再调用to方法
scala中无需包装类型,这是scala编译器的工作。Int数组在虚拟机中就是int[]数组。
scala> "Hello".intersect("world")
res13: String = lo //输出共通的一组字符
其中java.lang.String对象"Hello"被隐式转换成一个StringOps对象,然后StringOps类调用intersect方法。
说明:scala中我们用方法,而不是强制类型转换,来做数值类型之间的转换。
4. scala运算符实际上是方法。
a+b 其实是 a.+(b)的简写。
scala中不存在++/--操作符。因为无法简单的实现一个名为++的方法。数学函数调用更为简单:
scala> import scala.math._
import scala.math._ //引入包,‘_’为通配符
scala> pow(2,4)
res24: Double = 16.0
scala> sqrt(2) //等同于math.sqrt(2)
res25: Double = 1.4142135623730951
scala> min(3,Pi)
res27: Double = 3.0
apply方法
StringOps类中有一个方法:
def apply(n: Int) : Char 也就是说:
"Hello"(4) 是 "Hello".apply(4) 的简写。
scaladoc
http://www.scala-lang.org/api
二、习题答案
1.2 在Scala REPL中,计算3的平方根,然后再对该值求平方。现在,这个结果与3相差多少?(提示:res变量是你的朋友)scala> import math._
import math._
scala> sqrt(3)
res4: Double = 1.7320508075688772
scala> res4 * res4
res5: Double = 2.9999999999999996
scala> 3 - res5
res6: Double = 4.440892098500626E-16
1.3 res变量是val还是var?
res变量是val
1.4 Scala允许你用数字去乘字符串—去REPL中试一下”crazy”*3。这个操作做什么?在Scaladoc中如何找到这个操作?
scala> "crazy" *3
res7: String = crazycrazycrazy
http://www.scala-lang.org/api/current/#scala.collection.immutable.StringOps
1.5 10 max 2的含义是什么?max方法定义在哪个类中?
scala> 10 max 2
res8: Int = 10 //返回比较大的数
http://www.scala-lang.org/api/current/#scala.runtime.RichInt
1.6 用BigInt计算2的1024次方
scala> BigInt(2).pow(1024)
res11: scala.math.BigInt = 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
1.7 为了在使用probablePrime(100,Random)获取随机素数时不在probablePrime和Radom之前使用任何限定符,你需要引入什么?
Random在scala.util中,而probablePrime是BigInt中的方法.
scala> import scala.math.BigInt._
import scala.math.BigInt._
scala> import scala.util.Random
import scala.util.Random
scala> probablePrime(100,Random)
res12: scala.math.BigInt = 766635143018327231452301029633
1.8 创建随机文件的方式之一是生成一个随机的BigInt,然后将它转换成三十六进制,输出类似”qsnvbevtomcj38o06kul”这样的字符串。查阅Scaladoc,找到在Scala中实现该逻辑的办法。
scala> scala.math.BigInt(scala.util.Random.nextInt).toString(36)
res2: String = -6ihoyw
1.9 在Scala中如何获取字符串的首字符和尾字符?
scala> "Hello"(0)
res3: Char = H
scala> "Hello".reverse(0)
res4: Char = o
scala> "Hello".takeRight(1)
res6: String = o
1.10 take,drop,takeRight和dropRight这些字符串函数是做什么用的?和substring相比,他们的优点和缺点都是哪些?
scala> "Hello world".take(2)
res7: String = He
scala> "Hello world".drop(2)
res8: String = llo world
scala> "Hello world".takeRight(2)
res9: String = ld
scala> "Hello world".dropRight(2)
res10: String = Hello wor
scala> "Hello world".substring(2)
res12: String = llo world
scala> "Hello world".substring(2, 6)
res17: String = "llo "
take,drop,takeRight,dropRight适合从两边处理字符串,substring适合处理中间的字符串。
相关文章推荐
- Windows下Scala环境搭建
- Windows7下安装Scala 2.9.2教程
- Scala代码实现列出Hadoop 文件夹下面的所有文件
- ClassNotFoundException:scala.PreDef$
- sbt创建web项目
- XML 文件解析--含Unicode字符的XML文件
- Scala 学习随笔
- Scala 小程序记录(学习期间的代码片段)
- Spark机器学习(二) 局部向量 Local-- Data Types - MLlib
- Spark机器学习(三) Labeled point-- Data Types
- 分分钟掌握快速排序(Java / Scala 实现)
- Scala极速入门
- Spark初探
- Scala实现REST操作
- Scala method call syntax
- 关于Scala多重继承的菱形问题
- Scala 高阶函数(high-order function)剖析
- Scala Monad Design Pattern
- Scala类型系统——高级类类型(higher-kinded types)
- Spray.io搭建Rest服务