Сегодня мы узнаем, как использовать функции печати 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")
}
Чтобы напечатать переменную внутри оператора печати, мы должны использовать символ доллара ($) перед именем var/val внутри двойных кавычек. Чтобы вывести результат выражения, мы используем ${ //выражение здесь }
. Вывод при выполнении вышеуказанного кода в Kotlin Online Compiler приведен ниже.
Экранирование литералов и выражений
Чтобы экранировать символ доллара и, скажем, рассматривать ${выражение} только как строку, не вычисляя его, мы можем его экранировать.
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
(эквивалент void в Java).
Ввод пользователя в Kotlin
Для получения ввода пользователя можно использовать следующие два метода:
- readLine()
- Класс Scanner
Примечание: Для ввода пользователя требуется инструмент командной строки. Вы можете использовать REPL или IntelliJ. Давайте воспользуемся здесь IntelliJ.
Использование readLine()
readLine()
возвращает значение типа String?, чтобы обработать возможные значения null, которые могут возникнуть при достижении конца файла и т.д. В следующем коде приведен пример использования readLine()
fun main(args: Array<String>) {
println("Enter your name:")
var name = readLine()
print("Length is ${name?.length}")
}
Как видите, нам нужно извлечь значение nullable типа, чтобы использовать функции типа String для свойства. Используйте !! для принудительного преобразования типа String? в String только тогда, когда вы абсолютно уверены, что значение не будет null. В противном случае это вызовет сбой. Преобразование ввода в Integer Для преобразования входной строки в 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 типа сначала в Int с использованием toInt()
. Затем умножаем его на 5. Непрерывное чтение ввода Мы можем использовать цикл do while для непрерывного чтения ввода, как показано ниже.
do {
line = readLine()
if (line == "quit") {
println("Closing Program")
break
}
println("Echo $line")
} while (true)
}
Вывод выше в командной строке IntelliJ приведен ниже.
Чтение нескольких значений с использованием оператора split
Мы можем читать несколько значений, разделенных разделителями, и сохранять их в виде кортежа, как показано ниже.
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 Class
Для ввода мы можем использовать 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 следующей строке и также очищает буфер. Следующий код демонстрирует считывание различных типов ввода непосредственно внутри оператора печати.
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 выбрасывается, когда ввод отличается от ожидаемого типа. Вывод представлен ниже.
Котлин REPL
REPL, также известный как Read-Eval-Print-Loop, используется для запуска части кода непосредственно в интерактивной оболочке. Мы можем сделать это в нашем терминале/командной строке, инициируя компилятор Kotlin.
Установка командного компилятора
Мы можем установить командный компилятор на Mac/Windows/Ubuntu, как показано здесь. Обычно на Mac мы можем использовать HomeBrew в нашем терминале для установки компилятора Kotlin.
brew update
brew install kotlin
Как только это будет сделано, запустите REPL, введя kotlinc
в ваш терминал/cmd. Вот мой первый код в REPL. Это все, что касается функций печати в Kotlin и краткого введения в Kotlin REPL.
Source:
https://www.digitalocean.com/community/tutorials/kotlin-print-println-readline-scanner-repl