Scala编程-第5章 基本类型和操作- 高飞网

第5章 基本类型和操作

2017-03-18 05:43:36.0

5.2 字面量

字符串字面量

    在Java中的字符串,如果其中包含"等需要转义的字符,并且非常多时,将变得非常千笨拙而且容易拼写出错。因此Scala为原始字符患上 引入了一种特殊的语法。以同一行里的三个引号(""")为开始和结束。内部的原始字符串可以包含无论何种任意字符,包括新行,引号和特殊字符,当然同一行的三个引号除外。如

scala> println("""Welcom to Ultamix 3000.
     |            Type "Help" for help."""
     | )
Welcom to Ultamix 3000.
           Type "Help" for help.

如果想去掉每行的前导空格,可以在每行前加一个管道符号|,在字符串最后使用方法stripMargin

scala> println("""|Welcom to Ultamix 3000.
     |            |Type "Help" for help.""".stripMargin)
Welcom to Ultamix 3000.
Type "Help" for help.


符号字面量

scala> val s='aSymbol
s: Symbol = 'aSymbol

scala> s.name
res3: String = aSymbol


5.3 操作符和方法

    操作如+-*/实际上只是普通方法调用的另一种表现形式,如1+2与(1).+(2)是一回事,即即Int类中包含了+方法

scala> val sum=1+2
sum: Int = 3

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

    正如上面据说,+是Int类的一个方法,因此+可以看成一个中级操作符。

    反过来说,类中的任何方法,都可以看成是操作符,如

scala> "Hello".indexOf("el")
res4: Int = 1

scala> "Hello" indexOf "el"
res5: Int = 1

    多个参数的情况

scala> "Hello" indexOf ("el",2)
res6: Int = -1

    以上说的都是中缀操作符,还有前缀操作符,如-8,后缀的:8 toLong

    中缀是二元的,而前后缀是一元的

    对于前缀,实际上是调用了unary_-

scala> -2
res7: Int = -2

scala> (2).unary_-
res8: Int = -2

    后缀操作符

scala> val s = "Hello World" 
s: String = Hello World

scala> s toLowerCase
<console>:13: warning: postfix operator toLowerCase should be enabled
by making the implicit value scala.language.postfixOps visible.
This can be achieved by adding the import clause 'import scala.language.postfixOps'
or by setting the compiler option -language:postfixOps.
See the Scaladoc for value scala.language.postfixOps for a discussion
why the feature should be explicitly enabled.
       s toLowerCase
         ^
res12: String = hello world

    不过后缀貌似不建议这么用,给出了警告。


5.7 对象相等性

比较两个对象的相等性,即可以有==也可以用!=

scala> 1==2
res13: Boolean = false

scala> 1!=2
res14: Boolean = true

scala> 2==2
res15: Boolean = true

对象也起作用

scala> List(1,2,3)==List(1,2,3)
res16: Boolean = true

scala> List(1,2,3)==List(4,5,6)
res17: Boolean = false

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

scala> 1==1.0
res19: Boolean = true

有null也没问题

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

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

原理:首先检查左侧是否为null,如果不是,调用左操作数的equals方法。

这种检查发生在不同对象之间也会产生true,关键在于equals怎么实现的

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

Scala的==与Java的有何区别

    Java里的==既可比较原始类型也可比较引用类型,对于原始类型与Scala一致。对于引用类型,Java的==只比较引用类型的相等性,即是否指向了JVM中的同一个对象. 而Scala的==会比较对象的内容是否相等. 如果想用Scala比较引用是否相等,要使用eq或ne来做

scala> List(1,2,3) eq List(1,2,3)
res23: Boolean = false

scala> List(1,2,3) ne List(1,2,3)
res24: Boolean = true

5.9 富包装器

    Scala基本类型的可调用方法远多于前几段里所讲。下表的这些方法的使用要通过隐式转换(implicit conversion)。

代码结果
0 max 55
0 min 50
-2.7 abs2.7
-2.7 round-3L
1.5 isInfinityfalse
(1.0 / 0) isInfinitytrue
4 to 6Range(4, 5, 6)
"bob" capitalize"Bob"
"robert" drop 2"bert"