ウェブサイト検索

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


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

コトリンの出力関数

画面に何かを出力するために、以下の2つの方法が使用されます:

  • 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 名を使用する必要があります。式の結果を印刷するには、${ //式がここに入ります } を使用します。上記のコードを Kotlin Online Compiler で実行したときの出力は以下の通りです。

リテラルと式をエスケープする

ドル記号をエスケープして、$ {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に相当)を返します。

コトリン ユーザー入力

ユーザー入力を取得するためには、以下の2つの方法を使用できます。

  • readLine()
  • スキャナークラス

注意: ユーザー入力にはコマンドラインツールが必要です。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}")
}

ご覧の通り、String型の関数をプロパティで使用するためには、nullable型をアンラップする必要があります。値が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")
    }
}

再度、?. 演算子を使用して、nullable 型を最初に toInt() を使って 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 に変換するためにマップを使用します。タプルで指定された値より小さい値を入力すると、IndexOutOfBoundsException が発生します。両方の入力で try-catch を使用しました。出力はこのようになります:

あるいは、タプルの代わりに、以下のようにリストを使うこともできます。

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

コトリンスキャナークラス

入力を受け取るために、標準入力キーボードから入力を受け取る Scanner(System.`in`) を使用できます。以下のコードがそれを示しています:

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

    // nextInt() reads the next integer. next() reads the String
    var integer:Int = reader.nextInt()

    println("You entered: $integer")

reader.nextInt() は次の整数を読み込みます。reader.next() は次の文字列を読み込みます。 reader.nextFloat() は次の浮動小数点数を読み込み、などなど。reader.nextLine() はスキャナを次の行に移動させ、バッファもクリアします。以下のコードは、印刷文の中でさまざまなタイプの入力を直接読み取ることを示しています。

import java.util.*

fun main(args: Array<String>) {

    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)
    //move scanner to next line else the buffered input would be read for the next here only.
    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での私の最初のコードです。

関連記事: