字符串的两个亮点和命令行I/O

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 方法到当前作用域,因此你看可以在这个程序中使用它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值