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

今日は、Kotlinのプリント関数の使い方と、コンソールからユーザー入力を取得して解析する方法を学びます。さらに、Kotlin REPLについても見ていきます。

Kotlinプリント関数

画面に何かを出力するには、次の2つのメソッドが使用されます:

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

プリントステートメント内で変数を印刷するには、ダブルクォートで囲まれた文字列リテラル内で、ドル記号($)に続いて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)}"))    
}

次の出力が表示されます:注意:別の印刷を別の内部に渡すと、再帰のように動作します。最も内側のものが最初に印刷されます。printステートメントはUnit(Javaのvoidに相当)を返します。

Kotlinユーザー入力

ユーザー入力を取得するには、次の2つの方法が使用できます:

注意:ユーザー入力にはコマンドラインツールが必要です。REPLまたはIntelliJを使用できます。ここではIntelliJを使用しましょう。

readLine()の使用

readLine()は、null値が発生する可能性がある場合に備えて、型String?の値を返します。次のコードはreadLine()を使用した例を示しています。

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

型のnullableをアンラップして、プロパティ上のString型の関数を使用する必要があることがわかります。値がnullにならないことが絶対に確認されている場合にのみ、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")
    }
}

再び、?.演算子を使用して、最初にtoInt()を使用してnullableの型をIntに変換します。その後、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()関数は、各値をIntに変換するためにsplitにマップを使用します。タプルで指定された値よりも少ない値を入力すると、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()はStringを読み取ります。
    var integer:Int = reader.nextInt()

    println("You entered: $integer")

reader.nextInt()は次の整数を読み取ります。reader.next()は次のStringを読み取ります。reader.nextFloat()は次のfloatを読み取り、その他も同様です。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とも呼ばれ、コードの一部を直接インタラクティブなシェルで実行するために使用されます。ターミナル/コマンドラインで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