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

Vandaag zullen we leren hoe we de Kotlin printfuncties kunnen gebruiken en hoe we gebruikersinvoer van de console kunnen krijgen en parsen. Bovendien zullen we kijken naar Kotlin REPL.

Kotlin Printfuncties

Om iets op het scherm weer te geven, worden de volgende twee methoden gebruikt:

  • print()
  • println()

De print-verklaring geeft alles wat erin staat weer op het scherm. De println-verklaring voegt een nieuwe regel toe aan het einde van de uitvoer. De printfuncties roepen intern System.out.print aan. De volgende code toont printfuncties in actie:

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

Om een variabele binnen de printfunctie weer te geven, moeten we het dollarteken($) gebruiken gevolgd door de var/val-naam binnen een dubbel aanhalingsteken geciteerde tekenreeksliteral. Om het resultaat van een expressie weer te geven gebruiken we ${ //expressie hier }. De uitvoer wanneer de bovenstaande code wordt uitgevoerd op de Kotlin Online Compiler is hieronder gegeven.

Escape-tekens en expressies

Om het dollarteken te escapen en laten we zeggen ${expressie} als een string alleen te behandelen in plaats van het te berekenen, kunnen we het escapen.

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

Merk op dat een eenvoudig $ zonder enige expressie/variabele die ertegen is ingesteld, het impliciet ontsnapt en het alleen als onderdeel van de string behandelt.

Printfunctiewaarden

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

De volgende uitvoer wordt afgedrukt: Opmerking: Het doorgeven van een print binnen een andere gedraagt zich als recursie. De binnenste wordt eerst afgedrukt. Het printfout statement geeft een Unit terug (equivalent aan void in Java).

Kotlin Gebruikersinvoer

Om de gebruikersinvoer te krijgen, kunnen de volgende twee methoden worden gebruikt:

Opmerking: Gebruikersinvoer vereist een opdrachtregeltool. U kunt ofwel REPL of IntelliJ gebruiken. Laten we hier IntelliJ gebruiken.

Het gebruik van readLine()

readLine() retourneert de waarde van het type String? om om te gaan met null-waarden die kunnen optreden wanneer je het einde van een bestand leest, enzovoort. De volgende code toont een voorbeeld van het gebruik van readLine().

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

Zoals je kunt zien, moeten we het nullable type uitpakken om de functies van het String-type op de eigenschap te gebruiken. Gebruik !! om de String? gedwongen om te zetten naar String, alleen wanneer je er absoluut zeker van bent dat de waarde geen null zal zijn. Anders zal het crashen. Het converteren van de invoer naar een Integer Om de invoer String naar een Int te converteren, doen we het volgende:

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

We gebruiken opnieuw de ?. operator om het nullable type eerst naar een Int om te zetten met toInt(). Vervolgens vermenigvuldigen we het met 5. Continu Invoer Lezen We kunnen de do while-lus gebruiken om continu de invoer te lezen zoals hieronder wordt getoond.

    do {
        line = readLine()

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

        println("Echo $line")

    } while (true)
}

De uitvoer van het bovenstaande in de IntelliJ-opdrachtregel wordt hieronder gegeven.

Het lezen van Meerdere Waarden met behulp van de split operator

We kunnen meerdere waarden lezen die gescheiden zijn door scheidingstekens en ze opslaan in een tuple-vorm zoals hieronder getoond.

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

}

De functie split neemt het teken dat de scheidingsteken zal zijn. De functie readIntegers() gebruikt een map op een splitsing om elke waarde naar een Int te converteren. Als je waarden invoert die kleiner zijn dan de gespecificeerde in het tuple, krijg je een IndexOutOfBoundsException. We hebben try-catch gebruikt voor beide invoeren. De output ziet er zo uit: Als alternatief kunnen we in plaats van tuples ook een lijst gebruiken, zoals hieronder wordt getoond.

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

Kotlin Scanner Class

Om invoer te ontvangen kunnen we Scanner(System.`in`) gebruiken, die invoer van het standaardinvoertoetsenbord accepteert. De volgende code demonstreert hetzelfde:

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

    // nextInt() leest het volgende gehele getal. next() leest de String
    var integer:Int = reader.nextInt()

    println("You entered: $integer")

reader.nextInt() leest het volgende gehele getal. reader.next() leest de volgende String. reader.nextFloat() leest het volgende decimaal getal, enzovoort. reader.nextLine() geeft de Scanner door aan de volgende regel en wist ook de buffer. De volgende code demonstreert het lezen van verschillende typen invoer binnen een printfunctie.

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)
    // verplaats scanner naar volgende regel anders wordt de gebufferde invoer gelezen voor de volgende hier alleen. 
    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 wordt gegooid wanneer de invoer van een ander type is dan gevraagd. De output wordt hieronder gegeven.

Kotlin REPL

REPL, ook bekend als Read-Eval-Print-Loop, wordt gebruikt om een deel van de code direct uit te voeren in een interactieve shell. Dit kunnen we doen in onze terminal/opdrachtregel door de Kotlin-compiler te starten.

De commandoregelcompiler installeren

We kunnen de commandoregelcompiler installeren op Mac/Windows/Ubuntu zoals gedemonstreerd hier. Meestal kunnen we op een Mac HomeBrew gebruiken in onze terminal om de Kotlin-compiler te installeren.

brew update
brew install kotlin

Zodra dit is gebeurd, start je de REPL door kotlinc in te voeren in je terminal/cmd. Hier is mijn eerste code in de REPL. Dat is alles voor Kotlin-printfuncties en een korte introductie van Kotlin REPL.

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