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

今天我們將學習如何使用 Kotlin 的打印函數以及如何從控制台獲取和解析用戶輸入。此外,我們還將深入研究 Kotlin REPL。

Kotlin 打印函數

要在屏幕上輸出內容,使用以下兩種方法:

  • print()
  • println()

print 陳述將其內容打印到屏幕上。println 陳述在輸出的末尾添加一個新行。打印語句內部調用 System.out.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")    
}

要在打印語句中打印變量,我們需要在雙引號字符串文字內使用美元符號($),後跟變量名稱。要打印表達式的結果,我們使用 ${ //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 類型的函數。只有當您絕對確定值不會為空時,才使用 !! 將 String? 強制轉換為 String。否則它會導致崩潰。將輸入轉換為整數 要將輸入的 String 轉換為 Int,我們執行以下操作:

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")
    }
}

再次使用 ?. 運算符將可為空的類型轉換為 Int,首先使用 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() 函數使用在分割上的映射,將每個值轉換為整數。 如果輸入值少於元組中指定的值,則會出現 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,並且還清除緩衝區。 以下代碼演示了在 print 陳述中直接讀取不同類型的輸入。

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