- 字面量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的元组