Scala 的String 有很多很好的特性,但我们想花些时间强调两个特性,这两个特性在书的后面会使用到。第一个特性是Scala有一个很好的像Ruby似的方式来合并多个字符串。
给定下面三个变量:
val firstName = "John"
val mi = 'C'
val lastName = "Doe"
如果你喜欢的话,你可以像下面这样把它们连接在一起:
val name = firstName + " " + mi + " " + lastName
然而,Scala 提供了下面的更方便的方式:
val name = s"$firstName $mi $lastName"
这种形式创造了一种非常可读的形式来打印包含变量的字符串:
println(s"Name: $firstName $mi $lastName")
像展示的这样,你所需做的就是在字符串前放置 s , 然后在字符串里的变量前放置一个 $ 符号。这个特性叫做字符串插值。
字符串插值器的更多特性
Scala中的字符串插值提供了更多的功能。例如,你还可以把你的变量包围在大括号内:
println(s"Name: ${firstName} ${mi} ${lastName}")
对一些人来说这样更容易读,但是一个更重要好处是你可以在大括号里方表达式,下面展示了一个在REPL中的例子:
scala> println(s"1+1 = ${1+1}")
1+1 = 2
字符串插值的一些其他好处:
- 你可以在字符串前放置字母 f , 这样你可以在字符串里使用printf 的格式风格。
- raw 插值器不执行字符串里的转义字符(例如 \n)
scala> println(raw"Hello \n World")
Hello \n World
- 你可以创建自己的字符串插值器
更多细节可以查看字符串插值器文档。
多行字符串
第二个很棒的特性就是 你可以通过将字符串包含在三个双引号里来创建多行字符串:
val speech = """Four score and
seven years ago
our fathers ..."""
当你需要使用多行字符串时这是非常有帮助的。
这个基本方法的一个缺点是当第一行后的其他行是缩进的,在REPL中会这样显示:
scala> val speech = """Four score and
| seven years ago
| our fathers ..."""
speech: String =
Four score and
seven years ago
our fathers ...
一个简单的解决办法是在第一行后的所有行之前放一个 | 符号,并在字符串之后调用一下 stripMargin 方法。
val speech = """Four score and
|seven years ago
|our fathers ...""".stripMargin
当你这样做了,在REPL中会像下面这样显示,所有行都靠左对齐:
scala> val speech = """Four score and
| |seven years ago
| |our fathers ...""".stripMargin
speech: String =
Four score and
seven years ago
our fathers ...
因为这就是你通常想要的,所有这就是创建多行字符串的一般方法了。
命令行I/O
为了准备好去展示for 循环和,if 表达式和Scala的其他控制结构,一起来看看如何在命令行中处理Scala的输入输出。
写输出
正如我们之前展示的,你写输出到标准输出(STDOUT)使用println:
println("Hello, world")
上面这个函数会在字符串的末尾添加换行符,如果你不想换行,可以直接使用print来代替:
print("Hello without newline")
当需要时,你也可以写输出到标准错误(STDERR),像下面这样:
System.err.println("yikes, an error happened")
因为 println 会被频繁地使用,就不需要再特地导入它了。对其他频繁使用的类型也是如此 ---- String, Int, Float 等。
读输入
有很多种方式来读取命令行输入,但是最容易的方式是使用 scala.io.StdIn包中的 readLine 方法。为了使用这个方法,你需要先导入它:
import scala.io.StdIn.readLine
为了展示它是如何运行的,创建下面的一个小例子,把这些源代码放到 HelloInteractive.scala 的文件中:
import scala.io.StdIn.readLine
object HelloInteractive extends App {
print("Enter your first name: ")
val firstName = readLine()
print("Enter your last name: ")
val lastName = readLine()
println(s"Your name is $firstName $lastName")
}
然后用scalac进行编译:
$ scalac HelloInteractive.scala
接着运行scala:
$ scala HelloInteractive
当你运行这个程序并在提示下输入你的名和姓,会如下所示:
$ scala HelloInteractive
Enter your first name: Alvin
Enter your last name: Alexander
Your name is Alvin Alexander
import 的一个注意点
正如你在这个程序中看到的,你在Scala中引入类和方法到当前范围中就像Java或其他编程语言,用import 语句:
import scala.io.StdIn.readLine
import 语句引入readLine 方法到当前作用域,因此你看可以在这个程序中使用它。