Kotlin 的 print()、println()、readLine()、Scanner、REPL

今天我们将学习如何使用 Kotlin 打印函数以及如何从控制台获取和解析用户输入。此外,我们将深入研究 Kotlin REPL。

Kotlin 打印函数

要在屏幕上输出内容,使用以下两种方法:

  • print()
  • println()

print 语句会将其内部的所有内容打印到屏幕上。println 语句会在输出末尾附加一个换行符。print 语句内部调用了 System.out.print。以下代码展示了 print 语句的作用:

fun main(args: Array<String>) {
var x = 5
print(x++)
println("Hello World")
print("Do dinasours still exist?\n")
print(false)
print("\nx is $x.")
println(" x Got Updated!!")
print("Is x equal to 6?: ${x == 6}\n")    
}

要在 print 语句中打印变量,我们需要使用美元符号($),后跟在双引号字符串文字内的 var/val 名称。要打印表达式的结果,我们使用 ${ //expression goes here }。在 Kotlin 在线编译器上运行上述代码时的输出如下所示。

转义字面量和表达式

要转义美元符号,让 ${expression} 被视为仅字符串而不是计算它,我们可以对其进行转义。

fun main(args: Array<String>) {
val y = "\${2 == 5}"
println("y = ${y}")       
println("Do we use $ to get variables in Python or PHP? Example: ${'$'}x and ${'$'}y")
val z = 5
var str = "$z"
println("z is $str")
str = "\$z"
println("str is $str")
}

注意一个简单的 `$`,没有任何表达式/变量设置对它隐式地进行转义,并将其视为字符串的一部分。

打印函数值

fun sumOfTwo(a: Int, b: Int) : Int{
    return a + b
}

fun main(args: Array<String>) {
val a = 2
val b = 3
println("Value of ${'$'}a and ${'$'}b is : ${sumOfTwo(a,b)}") 
println(println("Printing Value of ${'$'}a and ${'$'}b is : ${sumOfTwo(a,b)}"))    
}

打印以下输出: 注意:在另一个内部传递打印的行为类似递归。最内部的先打印。打印语句返回一个 Unit(在Java中相当于void)。

Kotlin 用户输入

要获取用户输入,可以使用以下两种方法:

注意:用户输入需要一个命令行工具。您可以使用REPL或IntelliJ。让我们在这里使用IntelliJ。

使用 readLine()

readLine() 返回 String 类型的值吗?为了处理在读取文件末尾等情况下可能发生的空值,以下代码展示了使用 readLine() 的示例

fun main(args: Array<String>) {
    println("Enter your name:")
    var name = readLine()
    print("Length is ${name?.length}")
}

正如您所看到的,我们需要解包可空类型,以便在属性上使用 String 类型的函数。只有在您绝对确定该值不会为 null 时,才使用 !! 强制将 String? 转换为 String,否则它将导致崩溃。将输入转换为整数要将输入的字符串转换为整数,我们执行以下操作:

fun main(args: Array<String>) {
var number = readLine()
try {
        println("Number multiply by 5 is ${number?.toInt()?.times(5)}")
    } catch (ex: NumberFormatException) {
        println("Number not valid")
    }
}

同样,我们使用 ?. 运算符将可空类型首先转换为整数,使用 toInt()。然后我们将其乘以 5。连续读取输入我们可以使用 do while 循环来连续读取输入,如下所示。

    do {
        line = readLine()

        if (line == "quit") {
            println("Closing Program")
            break
        }

        println("Echo $line")

    } while (true)
}

上述代码在 IntelliJ 命令行中的输出如下所示。

使用分隔符读取多个值

我们可以通过分隔符分隔的方式读取多个值,并将它们保存为元组形式,如下所示。

fun readIntegers(separator: Char = ',')
        = readLine()!!.split(separator).map(String::toInt)

fun main(args: Array<String>) {
    println("Enter your values:")
    try {
        val (a, b, c) = readLine()!!.split(' ')
        println("Values are $a $b and $c")
    } catch (ex: IndexOutOfBoundsException) {
        println("Invalid. Missing values")
    }

    try {
        val (x, y, z) = readIntegers()
        println("x is $x y is $y z is $z")
    } catch (ex: IndexOutOfBoundsException) {
        println("Invalid. Missing values")
    }
    catch (ex: NumberFormatException) {
        println("Number not valid")
    }

}

split 函数接受作为分隔符的字符。readIntegers() 函数使用 split 进行映射,将每个值转换为 Int。如果输入的值少于元组中指定的值,将会出现 IndexOutOfBoundsException。我们在两个输入中都使用了 try-catch。输出如下所示: 或者,我们也可以使用列表,如下所示。

val ints: List<String>? = readLine()?.split("|".toRegex())
println(ints)

Kotlin Scanner 类

要接收输入,我们可以使用 Scanner(System.`in`),它从标准输入键盘接收输入。以下代码演示了相同的操作:

fun main(args: Array) {
    val reader = Scanner(System.`in`)
    print("Enter a number: ")

    // nextInt() 读取下一个整数。next() 读取字符串
    var integer:Int = reader.nextInt()

    println("You entered: $integer")

reader.nextInt() 读取下一个整数。 reader.next() 读取下一个字符串。reader.nextFloat() 读取下一个浮点数,依此类推。 reader.nextLine() 将 Scanner 传递给 nextLine,并清除缓冲区。以下代码演示了直接在打印语句中读取不同类型的输入。

import java.util.*

fun main(args: Array) {

    val reader = Scanner(System.`in`)
    print("Enter a number: ")

    try {
        var integer: Int = reader.nextInt()
        println("You entered: $integer")
    } catch (ex: InputMismatchException) {
        println("Enter valid number")
    }
    enterValues(reader)
    // 将扫描器移到下一行,否则缓冲输入将在下一个地方被读取。
    reader.nextLine()
    enterValues(reader)
}

fun enterValues(reader: Scanner) {
    println("Enter a float/boolean :")
    try {
        print("Values: ${reader.nextFloat()}, ${reader.nextBoolean()}")
    } catch (ex: InputMismatchException) {
        println("First value should be a float, second should be a boolean. (Separated by enter key)")
    }
}

当输入的类型与所要求的类型不同时,将抛出 InputMismatchException。输出如下所示。

Kotlin REPL

REPL(Read-Eval-Print-Loop)也称为读取-求值-输出-循环,用于直接在交互式 shell 中运行代码的一部分。我们可以通过启动 Kotlin 编译器在我们的终端/命令行中这样做。

安装命令行编译器

我们可以在 Mac/Windows/Ubuntu 上安装命令行编译器,如此处所示。通常,在 Mac 上,我们可以在终端上使用 HomeBrew 安装 Kotlin 编译器。

brew update
brew install kotlin

安装完成后,通过在终端/cmd 中输入 kotlinc 来启动 REPL。以下是我在 REPL 中的第一段代码。 关于 Kotlin 打印函数和 Kotlin REPL 的快速介绍就是这些了。

Source:
https://www.digitalocean.com/community/tutorials/kotlin-print-println-readline-scanner-repl