Scala编程第3版第五章(基础类型和操作)
2020-02-18 00:06:17    34    0    0
yuziyue

Scala基础类型



Scala中以 0x 或者 0X开头的是十六进制,可以包含0到9以及大写或小写的A到F表示的数字,注意:Scala的shell总是以十进制打印整数。


Scala的3引号和Python的类似,但是Scala可以去除开始的空格,用法如下:

scala> """
     | where are you
     | hahahaha
     | bye
     | """.stripMargin
res0: String =
"
where are you
hahahaha
bye
"

stripMargin 可以去除空格,前台是要在每一行的开头加上一个竖线。


s字符串

// 变量
val name = "reader"
println(s"Hello, $name")             // Hello, reader

// 表达式
println(s"The answer is ${6 * 7}")   //The answer is 42

// 转义反斜线
println(s"where are \\\\ you from")  // where are \\ you from


raw字符串

和s字符串类似,不同点是它并不识别字符转义序列

println(raw"where are \\\\you from")   // where are \\\\ you from


f字符串

f字符串可以使用类似 printf 风格的指令。需要将指令放在表达式之后,一百分号(%)开始,使用 java.util.Formatter 中给出的语法。

scala> f"I know: ${math.Pi}%.5f"
res22: String = I know: 3.14159

scala> f"my salary is: ${salary}%.2f, Pi is about: ${math.Pi}%.13f"
res25: String = my salary is: 100.90, Pi is about: 3.1415926535898


中缀操作符

1 + 2 表示 Int 类包含了一个名为+的方法,接受一个Int参数,返回Int类型的结果。这里+是一个中缀操作符。

scala> val sum = 1 + 2      // Scala 将调用 1.+(2)
sum: Int = 3

scala> val sumMore = 1.+(2)
sumMore: Int = 3


事实上,Int包含了多个重载的+方法,分别接受不同的参数类型。

scala> val longSum = 1 + 2L
longSum: Long = 3


下面的例子是String类型的indexOf操作符。这里注意:当使用 s.indexOf('o') 的时候,indexOf并不是操作符,当时用 s indesOf 'o' 时才是操作符,因为你使用的是操作符表示法。

scala> val s = "Hello, world!"
s: String = Hello, world!

scala> s indexOf 'o'
res26: Int = 4

scala> s indexOf ('o', 5)       // 多个参数用括号括起来
res27: Int = 8


前缀操作符

中缀操作符表示法意味着被调用的方法名位于对象和你想传入的参数中间。Scala还提供了两种操作符表示法:前缀和后缀。在前缀表示法中,需要将方法名放在你要调用的方法的对象前面(比如“-7”中的“-”)。在后缀表示法中,需要将方法名放在对象之后(比如“7 toLong”中的“toLong”)。


前缀操作符的完整调用方法为 unary_ 加上操作符,比如Scala会把-2.0这样的表达式转换成如下的方法调用:(2.0).unary_- 

scala> -2.0
res41: Double = -2.0

scala> (2.0).unary_-
res45: Double = -2.0


唯一能被用作前缀操作符的是 +、-、!和~。因此,如果你定义了一个名为unary_!的方法,可以对满足类型要求的值或变量使用前缀操作符表示法,比如!p。不过如果你定义一个名为 unary_* 的方法,就不能用前缀操作符表示法了,因为*并不是可以用作前缀操作符的四个标识符之一。可以像正常的方法调用那样调用 p.unary_*


后缀操作符

后缀操作符是那些不接收参数并且在调用时没有用圆括号的方法。在Scala中,可以在方法调用时省去空的圆括号。从约定俗成的角度讲,如果方法有副作用的时候保留空的圆括号,比如println();而在方法没有副作用时则可以省掉这组圆括号,比如对String调用toLowerCase时

scala> val s = "Hello, world!"
s: String = Hello, world!

Scala> s.toLowerCase
res5: String = hello, world!

// 去掉句点以后,toLowerCase被当做后缀操作符用在了操作元 s 上
scala> s toLowerCase
res6: String = hello, world!


对象相等性

如果你想要比较两个对象是否相等,可以用==或与之相反的 != ,这些操作符实际上可以被应用于所有对象,并不仅仅是基础类型。== 几乎涵盖了大部分相等性比较的类型

scala> 1 == 1.0
res76: Boolean = true

scala> List(1, 2, 3) == "hello"
res77: Boolean = false

scala> List(1, 2, 3) == null
res78: Boolean = false

scala> ("he" + "llo") == "hello"
res79: Boolean = true

在Java中,可以用==来比较基本类型和引用类型。对基本类型而言, Java的==比较的是值的相等性,就跟Scala一样。但是对于引用类型, Java的==比较的是引用相等性(reference equality),意思是两个变量指向JVM的堆上的同一个对象。Scala也提供了用于比较引用相等性的机制,即名为eq的方法。不过,eq和跟它对应的ne只对那些直接映射到Java对象的对象有效。

上一篇: Scala编程第3版第六章(函数式对象)

下一篇: Windows命令行配置IP地址

34 人读过
文档导航