Функция main()

Я предполагаю, что вы задавали себе вопрос о том, почему мы должны писать именно fun main() {} в каждой программе. Теперь мы собираемся докопаться до сути этого!

Объявление функции main()

Итак, присмотритесь повнимательнее к функции main(). На самом деле, это очень распространенная вещь: вы можете делать именно то, что делаете с любой другой функцией. Единственное отличие заключается в том, что это точка входа в программу. Это означает, что запуск программы начинается с вызова этой функции.

Давайте подробнее рассмотрим, из чего состоит main():

fun main() {}
  • fun - это ключевое слово, которое показывает, что main() - это функция. Просто обычная функция

  • main - это имя функции. Важно знать, что мы не можем его изменить: если мы изменим его, например, на main(), программа будет компилироваться, но не запустится

  • и, наконец, тело функции, как вы хорошо знаете, будет заключено в фигурные скобки.

На самом деле, в синтаксисе main() все еще могут быть входные параметры — args. Это необязательная часть объявления main(), и мы поговорим об этом подробнее позже.

Итак, все, что вы можете сделать с помощью обычной функции, вместо переименования, можно сделать с помощью main().

Его главная особенность заключается в том, что его наличие обязательно: без него программа не запустится. Но main() также может быть вызван специально. Например, он может быть вызван сам по себе:

var decrease = 3

fun main() {
    if (decrease == 0)
        return
    decrease = decrease - 1
    println(decrease)
    main()
}

В этой программе каждый вызов main() уменьшает значение глобальной переменной decrease на 1 и выводит текущее значение, пока оно не станет равным 0. Слово "глобальный" означает, что эта переменная доступна из любого места в программе, в частности, в функции main().

Вывод этого кода выглядит следующим образом:

2
1
0

Аргументы функции main()

На самом деле функция main() может иметь входные параметры. Они должны называться args и храниться в массиве строк. В таком случае синтаксис main() будет выглядеть следующим образом:

fun main(args: Array<String>) {}

Работа с args осуществляется так же, как и с другими массивами: например, args.size вернет количество аргументов, а args[1] вернет программе второй аргумент.

Отлично, но для чего это нужно?

Простыми словами, аргументы функции main() являются аргументами программы. Вы, вероятно, много раз в своей жизни использовали возможность его настройки, например, когда открывали файл с помощью "Открыть с помощью...": в этом случае местоположение файла передается в качестве аргументов программы.

Итак, используя аргументы main(), мы передаем некоторые дополнительные внешние данные в саму программу.

Работа с командной строкой

Мы можем передавать аргументы программе с помощью инструментов IDE или командной строки. Вы уже знаете, как это можно сделать с помощью IDE. Другой способ немного сложнее.

Рассмотрим это более подробно: это универсальный подход, и навыки командной строки в любом случае понадобятся много раз на вашем пути программиста. Например, в простых случаях это может избавить от необходимости создавать графический интерфейс для взаимодействия с пользователем. Не бойтесь, если сейчас этот подход покажется вам слишком сложным: это всего лишь пример того, как точно задать аргументы программы с помощью командной строки.

?> Чтобы отправить аргументы командной строки в ваше приложение, вам нужна предварительно скомпилированная программа.

Итак, рассмотрим, как вы можете передавать аргументы через консоль: во-первых, вам нужна скомпилированная программа. Когда он у вас есть, вы вызываете командную строку. После этого вы запускаете приложение с помощью следующей команды:

java -jar имя_файла.jar args

После того как вы укажете имя файла с расширением .jar, вы так же можете передать в аргументы программы на месте args, разделенные пробелом. Теперь давайте посмотрим, как все это работает, на очень простом примере.

Практический пример

Давайте посмотрим на следующий код:

fun main(args: Array<String>) {
    println(args[0])
    println(args[1])
}

Эта программа выводит первые две строки, которые были указаны в качестве аргументов программы. Пусть эта программа находится в файле с именем print_args.kt. И давайте передадим, например, следующие аргументы программы (или аргументы функции main()): "Hello,", "Kotlin!". Сделайте это с помощью командной строки:

java -jar print_args.jar Hello, Kotlin!

Тогда результат будет следующим:

Hello,
Kotlin!

Итак, наш код был реализован следующим образом:

fun main(args: Array<String>) {
    println(args[0]) // Hello,
    println(args[1]) // Kotlin!
}

Если мы вместо этого передадим "Love", "Kotlin!", будет напечатано следующее:

Love
Kotlin!

Получается, что ничего не меняя в коде, мы влияем на результат программы, задавая аргументы main().

С аргументами или без них?

Как мы упоминали выше, функция main() может существовать как с аргументами, так и без них. В качестве иллюстрации давайте запустим один и тот же код, который не использует аргументы программы двумя способами:

fun main(args: Array<String>) {
    val firstName = "Luke"
    val lastName = "Skywalker"
    println(firstName + " " + lastName) // Luke Skywalker
}
fun main() {
    val firstName = "Luke"
    val lastName = "Skywalker"
    println(firstName + " " + lastName) // Luke Skywalker
}

Так что все работает!

Более того, не будет ошибки, когда ваш файл будет содержать обе версии main() – с аргументами и без них. Программа просто начнётся с выполнения main(args: Array <String>) {}:

fun main(args: Array<String>) {
    println(args[0]) // Love
    println(args[1]) // Kotlin!
}

fun main() {
    println("Hello, World!")
} // функция не будет запущена

Однако вы должны помнить, что в файле не может быть нескольких объявлений main() с аргументами или нескольких main() без них одновременно! Оба варианта объявления main() могут быть представлены только в одном экземпляре, так как это правило подходит для любой другой функции.

Как насчёт другого типа, другого числа и другого имени аргументов? Конечно, у вас может быть функция main() с совершенно разными входными параметрами в одном файле, например, это может быть main(arg: Int) или main(a: Double, b: String), но тогда она больше не будет точкой входа. Это будет просто обычная функция. Для того, чтобы программа запустилась, программный файл должен содержать именно функцию с сигнатурой main() или main(args: Array<String>).

Подводя итог, вы можете использовать args, когда вам нужно работать с аргументами программы. Но если ваша программа не требует аргументов командной строки, аргументы командной строки могут быть опущены.

Заключение

Итак, программа начинается с main(): теперь вы хорошо ее знаете, и вы знаете, как задавать аргументы этой функции и зачем она нужна. Теперь вы можете передавать данные в программу и изменять результат ее выполнения без изменения кода. И вы также узнали, как это сделать через командную строку. Это, безусловно, необходимый опыт для программиста.

Last updated