Kotlin. Перегрузка функций. Имена функций в обратных кавычках
Содержание
- 1. Понятие о перегрузке функции
- 2. Примеры перегрузки функций
- 2.1. Функция Min(). Поиск минимального значения между разным количеством чисел
- 2.2. Функция ConcatStrings(). Объединение разного количества строк
- 2.3. Функция Average(). Вычисление среднего арифметического для разного количества целых и вещественных чисел
- 2.4. Функция AscSequence(). Определяет, образуют ли числа возрастающую последовательность
- 3. Функции в обратных кавычках. Необходимость применения
- 4. Примеры функций, имена которых формируются в обратных кавычках
- Связанные темы
Поиск на других ресурсах:
1. Понятие о перегрузке функции
В языке программирования Kotlin функция может быть перегружена. Перегрузка функции означает объявление функции с тем же именем несколько раз но с разными параметрами.
В наиболее общем случае перегрузка функции выглядит следующим образом:
fun FuncName(list_of_parameters1) : return_type1 { // ... } fun FuncName(list_of_parameters2) : return_type2 { // ... } ... fun FuncName(list_of_parametersN) : return_typeN { // ... }
здесь
- FuncName – перегруженное имя функции;
- list_of_parameters1, list_of_parameters2, list_of_parametersN – список параметров соответствующего варианта перегруженной функции с именем FuncName. Каждый список параметров должен отличаться количеством или порядком следования типов параметров;
- return_type1, return_type2, return_typeN – тип, возвращаемый соответствующим вариантом функции FuncName. Компилятор не считает возвращаемый тип как средство перегрузки функции.
Важно. Чтобы перегрузить имя функции (функцию), необходимо, чтобы сигнатура ее параметров отличалась в объявлении каждого перегруженного варианта функции. В противном случае компилятор будет выдавать ошибку.
⇑
2. Примеры перегрузки функций
2.1. Функция Min(). Поиск минимального значения между разным количеством чисел
Объявляется перегруженная функция Min(), вычисляющая минимальное значение между двумя, тремя, четырьмя, пятью числами типа Double.
// Перегрузка функции с именем Min // Функция находит минимальное значение между разным количеством чисел. // Между 2-мя числами fun Min(num1:Double, num2:Double):Double { if (num1<num2) return num1 return num2 } // Между тремя числами fun Min(num1:Double, num2:Double, num3:Double):Double { var min = num1 if (min>num2) min=num2 if (min>num3) min=num3 return min } // Между четырьмя числами fun Min(num1:Double, num2:Double, num3:Double, num4:Double):Double { var min = num1; if (min>num2) min = num2 if (min>num3) min = num3 if (min>num4) min = num4 return min } // Между пятью числами fun Min(num1:Double, num2:Double, num3:Double, num4:Double, num5:Double):Double { var min = num1 if (min>num2) min = num2 if (min>num3) min = num3 if (min>num4) min = num4 if (min>num5) min = num5 return min } fun main(args:Array<String>) { // Демонстрация вызова функции Min // 1. Вызывается функция Min() с 2-мя параметрами var min = Min(2.5, 3.8) println(min) // 2. Вызов функции Min() с 3 параметрами min = Min(2.6, 3.8, 1.2) println(min) // 3. Вызов функции Min() с 4 параметрами println(Min(1.7, 3.2, 0.8, -3.5)) // 4. Вызов функции Min() с 5 параметрами println(Min(7.2, 8.1, 6.5, 4.4, 2.8)) }
Результат выполнения программы
2.5 1.2 -3.5 2.8
⇑
2.2. Функция ConcatStrings(). Объединение разного количества строк
В примере приводится перегрузка функции ConcatStrings(), осуществляющая конкатенацию (объединение) разного количества строк. Реализованы 3 перегрузки функции.
// Перегрузка функции с именем ConcatStrings // Функция объединяет разное количество строк // 2 строки fun ConcatStrings(s1:String, s2:String):String { return s1+s2 } // 3 строки, вариант функции с единственным выражениемfun ConcatStrings(s1:String, s2:String, s3:String) : String = s1+s2+s3 // 4 строки, вариант функции с единственным выражением// без явного указания типа возвращаемого результата fun ConcatStrings(s1:String, s2:String, s3:String, s4:String) = s1+s2+s3+s4 fun main(args:Array<String>) { // Демонстрация вызова функции ConcatStrings() // 1. Вызывается функция ConcatStrings() с 2-мя параметрами var resStr:String resStr=ConcatStrings("Hello", " world!") println(resStr) // 2. Вызов функции ConcatStrings() с 3 параметрами resStr = ConcatStrings("bestprog",".","net") println(resStr) // 3. Вызов функции ConcatStrings() с 4 параметрами println(ConcatStrings("Red-","Green-","Blue-","Yellow")) }
Результат выполнения программы
Hello world! bestprog.net Red-Green-Blue-Yellow
⇑
2.3. Функция Average(). Вычисление среднего арифметического для разного количества целых и вещественных чисел
В примере показана перегрузка функции Average(), в которой входными параметрами являются разное количество разнотипных чисел типов Int, Double, Float, Long.
// Функция Average() // Вычисление среднего арифметического для разного количества чисел // 1. Вариант, где входными параметрами являются типы Int, Double fun Average(a:Int, b:Double) = (a+b)/2.0 // 2. Вариант для случая Double, Int fun Average(a:Double,b:Int):Double { return (a+b)/2.0 } // 3. Вариант для случая Long, Float fun Average(a:Long, b:Float):Double = (a+b)/2.0 // 4. Вариант для случая Int, Float, Double fun Average(a:Int, b:Float, c:Double) = (a+b+c)/3 fun main(args:Array<String>) { // Демонстрация использования функции Average // 1. Типы Int, Double val avg1 = Average(5, 6.8) println("avg1 = " + avg1) // 2. Типы Double, Int val avg2 = Average(7.2, 8) println("avg2 = " + avg2) // 3. Типы Long, Float val avg3 = Average(70L, 3.8f) println("avg3 = " + avg3) // 4. Типы Int, Float, Double val avg4 = Average(10, 20.0f, 15.0) println("avg4 = " + avg4) }
Результат выполнения программы
avg1 = 5.9 avg2 = 7.6 avg3 = 36.900001525878906 avg4 = 15.0
⇑
2.4. Функция AscSequence(). Определяет, образуют ли числа возрастающую последовательность
Пример показывает объявление и использование 4-х перегруженных функций, которые определяют образуют ли несколько чисел возрастающую последовательность.
// Функция AscSequence() // Определить, образуют ли числа возрастающую последовательность // 1. Вариант, где входными параметрами есть типы Int, Int, Int fun AscSequence(a:Int, b:Int, c:Int) : Boolean { return (a<b)and(b<c) } // 2. Вариант для случая Double, Double, Double fun AscSequence(a:Double,b:Double, c:Double):Boolean { return (a<b)and(b<c) } // 3. Вариант для случая Int, Int, Int, Int fun AscSequence(a:Int,b:Int,c:Int,d:Int):Boolean = (a<b)and(b<c)and(c<d) // 4. Вариант для случая Float, Int, Double, Double fun AscSequence(a:Float,b:Int,c:Double,d:Double) = (a<b)and(b<c)and(c<d) fun main(args:Array<String>) { // Демонстрация использования функции AscSequence() // 1. Случай AscSequence(Int, Int, Int) println("5<6<8 => " + AscSequence(5, 6, 8)) // 2. Случай AscSequence(Double, Double, Double) val res = AscSequence(2.8, 3.5, 1.7) println("2.8<3.5<1.7 => " + res) // 3. Случай AscSequence(Int, Int, Int, Int) println("6<8<9<7 = " + AscSequence(6, 8, 9, 7)) // 4. Случай AscSequence(Float, Int, Double, Double) println("7.5f<2<3.4<5.0 => " + AscSequence(7.5f, 2, 3.5, 5.0)) }
Результат выполнения программы
5<6<8 => true 2.8<3.5<1.7 => false 6<8<9<7 = false 7.5f<2<3.4<5.0 => false
⇑
3. Функции в обратных кавычках. Необходимость применения
В языке Kotlin существует средство задания имени функции в обратных кавычках – ` `. В этом случае имя функции может содержать символы пробела или другие нестандартные символы.
В наиболее общем применении объявление такой функции имеет вид:
fun `set_of_characters`(list_of_parameters):return_type { // ... }
здесь
- set_of_characters – набор символов, определяющих имя функции. Здесь допускается указывать символ пробел или другие нестандартные символы;
- list_of_parameters – список параметров функции;
- return_type – тип, возвращаемый функцией.
Вызов вышеприведенного объявления функции может быть примерно таким
`set_of_characters`(...)
здесь … означают перечень аргументов, передаваемых в функцию.
Задание имен функций в обратных кавычках необходимо по следующим причинам:
- для поддержания совместимости с Java. Это могут быть случаи, когда вызываются методы Java из кода в файле на языке Kotlin. Примером этого применения может служить использование различных зарезервированных ключевых слов языка Java, которые нельзя применять в качестве имен для функций в языке Kotlin (например, ключевое слово is);
- придание большей наглядности использования функций с помощью целых предложений, взятых в обратных кавычках.
⇑
4. Примеры функций, имена которых формируются в обратных кавычках
Ниже приводятся примеры функций, имена которых взяты в обратные кавычки. Имена некоторых функций более красноречиво объясняют их предназначение.
// Функции, взятые в обратные кавычки `` // Функция, вычисляющая сумму трех параметров: a+b+c fun `a + b + c`(a:Int, b:Int, c:Int) = a+b+c // Функция, возвращающая реверсованную строку fun `abc = cba`(s:String) : String { var s2 : String = "" for (c : Char in s) s2 = c + s2 return s2 } // Функция возвращающая произведение двух чисел fun `a*b`(a:Double, b:Double) = a*b fun main(args:Array<String>) { // Вызов функции `a + b + c`() val res1 = `a + b + c`(6, 5, 9) println("res1 = " + res1) // Вызов функции `abc = cba`() val res2 = `abc = cba`("abcdef") println("res2 = " + res2) // Вызов функции умножения двух чисел типа Double println(`a*b`(9.5, 3.2)) }
Результат выполнения программы
res1 = 20 res2 = fedcba 30.400000000000002
⇑
Связанные темы
- Функции. Ключевое слово fun. Рефакторинг функции. Оператор return
- Область видимости функции. Локальная область видимости. Аргументы по умолчанию
- Функции с единственным выражением. Тип Unit. Функции, возвращающие тип Unit. Примеры
- Именованные аргументы функций. Тип Nothing. Перегрузка функций
⇑