Scala | 教程 | 学习手册 --- 字面量/值/变量和类型

2021-12-14 18:38:13 浏览数 (1)

  • 字面量Literal:如数字5、字母A和文本“Hello World”,是直接出现在源代码中的数据
  • 值value:不可变的、有类型的存储单元。不允许重新赋值
  • 变量var:可变的、有类型的存储单元。
  • 类型type:所有数据都对应一个特定的类型。所有scala类型都定义为包含方法的类,这些方法用来处理数据。

代码语言:javascript复制
val <identifier>[: <type>] = <data>

例子:

代码语言:javascript复制
scala> val x: Int = 20
x: Int = 20

scala> val greeting: String = "Hello, World"
greeting: String = Hello, World

scala> val atSymbol: Char = '@'
atSymbol: Char = @

也可以不指定类型,scala会做类型推导

代码语言:javascript复制
scala> val x = 20
x: Int = 20

scala> val greeting = "Hello, World"
greeting: String = Hello, World

scala> val atSymbol = '@'
atSymbol: Char = @

变量

代码语言:javascript复制
var <identifier>[: <type>] = <data>
scala> var x = 5
x: Int = 5

scala> x = x * 4
x: Int = 20

但也不能赋为类型不兼容的数据。不过,如果定义类型double的var,再赋值Int值是可以的。因为Int数可以转为Double数。

命名

所有字符(不包括点号和[])和数字。scala合法标识符的规则:

  • 一个字母后跟有0个或多个字母和数字,可结合下划线_
  • 一个或多个操作符字符
  • 一个或多个除反引号外的任意字符

在命名上,类型和类一般大写字母开头,值和变量小写字母开头,其余单词首字母大写

代码语言:javascript复制
scala> val π = 3.14159                                                     (1)
π: Double = 3.14159

scala> val $ = "USD currency symbol"
$: String = USD currency symbol
# 除了点号和[]之外的符号都可以

scala> val o_O = "Hmm"
o_O: String = Hmm

scala> val 50cent = "$0.50"                                                (2)
<console>:1: error: Invalid literal number
       val 50cent = "$0.50"
           ^
# 不能以数字开头

scala> val a.b = 25                                                        (3)
<console>:7: error: not found: value a
       val a.b = 25

scala> val `a.b` = 4                                                       (4)
a.b: Int = 4

类型

数据类型Byte, short, int, long, float, double

可以自动将数字从较低等级转换为较高等级,不允许从较高等级转到较低等级

代码语言:javascript复制
scala> val b: Byte = 10
b: Byte = 10

scala> val s: Short = b
s: Short = 10

scala> val l: Long = 20
l: Long = 20

scala> val i: Int = l
<console>:8: error: type mismatch;
 found   : Long
 required: Int
       val i: Int = l

可以使用toType方法手动转换。

代码语言:javascript复制
scala> val l: Long = 20
l: Long = 20

scala> val i: Int = l.toInt
i: Int = 20

scala可以自动推导类型

代码语言:javascript复制
scala> val pi = 3.1416
pi: Double = 3.1416

字符串

char字面量要使用单引号

代码语言:javascript复制
scala> val c = 'A'
c: Char = A

使用双引号,特殊字符用反斜线转义

代码语言:javascript复制
scala> val signature = "With Regards, nYour friend"
signature: String =
With Regards,
Your friend

多行字符串可用三重引号

代码语言:javascript复制
scala> val greeting = """She suggested reformatting the file
     | by replacing tabs (t) with newlines (n);
     | "Why do that?", he asked. """

字符串内插

可以使用相加来连接字符串

代码语言:javascript复制
scala> println("Pi, using 355/113, is about "   approx   "." )
Pi, using 355/113, is about 3.141593.

或者使用内插记法,识别解析外部值和变量名。在字符串的第一个双引号前加s前缀,使用$符号指示外部数据的引用

代码语言:javascript复制
println(s"Pi, is about $approx")
scala> val item = "apple"
item: String = apple

scala> s"How do you like them ${item}s?"
res0: String = How do you like them apples?

scala> s"Fish n chips n vinegar, ${"pepper "*3}salt"
res1: String = Fish n chips n vinegar, pepper pepper pepper salt

若要控制数据格式化时,如字符个数或小数值得显示,使用printf记法,只需要把前缀改为f,连printf都不用写

代码语言:javascript复制
scala> val item = "apple"
item: String = apple

scala> f"I wrote a new $item%.3s today"
res2: String = I wrote a new app today

scala> f"Enjoying this $item ${355/113.0}%.5f times today"
res3: String = Enjoying this apple 3.14159 times today

正则表达式

scala的正则表达式基于java类java.util.regex.Pattern。java的正则表达式可能与其他语言的正则有所不同。

代码语言:javascript复制
scala> "milk, tea, muck" replaceAll ("m[^ ] k", "coffee")
res7: String = coffee, tea, coffee

scala> "milk, tea, muck" replaceAll ("m[^ ]", "coffee")
res5: String = coffeelk, tea, coffeeck

scala> " Froggy went a' courting" matches ".*courting"
res2: Boolean = true

scala> " Froggy went a' courting" matches "*courting"
java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*courting

用正则表达式捕获值

格式

代码语言:javascript复制
val <Regex value>(<identifier>) = <input string>

在字符串最后加上一个r操作符,可以将字符串转换为正则表达式类型,这会返回一个Regex的instantce

代码语言:javascript复制
scala> val input = "Enjoying this apple 3.14159 times today"
input: String = Enjoying this apple 3.14159 times today

scala> val pattern = """.* apple ([d.] ) times .*""".r                     (1)
pattern: scala.util.matching.Regex = .* apple ([d.] ) times .*             (2)

scala> val pattern(amountText) = input                                      (3)在instance上获取匹配到的数值,这种格式有点奇怪。
amountText: String = 3.14159

scala> val amount = amountText.toDouble                                     (4)
amount: Double = 3.14159

scala类型概述

注意scala不支持类型到boolean的自动转换,非null字符不会转换到true,数字0也不等于false

Unit类似java中的void关注简直,定义一个函数不返回数据。在scala中作为不返回任何结果的函数或表达式的返回类型。比如println函数返回unit类型

代码语言:javascript复制
scala> val nada = ()
nada: Unit = ()

常用类型操作

asInstanceOf, getClass, isInstanceOf, hashCode, to, toString

元组

包含一个或多个值得有序容器,不同于列表和组,没有办法迭代处理一个元组中的元素,用小括号包围

格式

代码语言:javascript复制
( <value 1>, <value 2>[, <value 3>...] )
scala> val info = (5, "Korben", true)
info: (Int, String, Boolean) = (5,Korben,true)

scala> val name = info._2
name: String = Korben
# 使用_1,_2来索引元组中的元素,注意从1开始而不是0

scala> val reversed = red._2 -> red._1
reversed: (String, String) = (0xff0000,red)
# 使用关系操作符->来暗示这个是键值对,创建一大小为2的元组

0 人点赞