Kotlin передать функцию как параметр
Перейти к содержимому

Kotlin передать функцию как параметр

  • автор:

Kotlin передать функцию как параметр

Функции высокого порядка (high order function) — это функции, которые либо принимают функцию в качестве параметра, либо возвращают функцию, либо и то, и другое.

Функция как параметр функции

Чтобы функция могла принимать другую функцию через параметр, этот параметр должен представлять тип функции:

fun main() < displayMessage(::morning) displayMessage(::evening) >fun displayMessage(mes: () -> Unit) < mes() >fun morning() < println("Good Morning") >fun evening()

В данном случае функция displayMessage() через параметр mes принимает функцию типа () -> Unit , то есть такую функцию, которая не имеет параметров и ничего не возвращает.

fun displayMessage(mes: () -> Unit)

При вызове этой функции мы можем передать этому параметру функцию, которая соответствует этому типу:

displayMessage(::morning)

Рассмотрим пример параметра-функции, которая принимает параметры:

fun main() < action(5, 3, ::sum) // 8 action(5, 3, ::multiply) // 15 action(5, 3, ::subtract) // 2 >fun action (n1: Int, n2: Int, op: (Int, Int)-> Int) < val result = op(n1, n2) println(result) >fun sum(a: Int, b: Int): Int < return a + b >fun subtract(a: Int, b: Int): Int < return a - b >fun multiply(a: Int, b: Int): Int

Здесь функция action принимает три параметра. Первые два параметра - значения типа Int. А третий параметр представляет функцию, которая имеет тип (Int, Int)-> Int , то есть принимает два числа и возвращает некоторое число.

В самой функции action вызываем эту параметр-функцию, передавая ей два числа, и полученный результат выводим на консоль.

При вызове функции action мы можем передать для ее третьего параметра конкретную функцию, которая соответствует этому параметру по типу:

action(5, 3, ::sum) // 8 action(5, 3, ::multiply) // 15 action(5, 3, ::subtract) // 2

Возвращение функции из функции

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

fun main() < val action1 = selectAction(1) println(action1(8,5)) // 13 val action2 = selectAction(2) println(action2(8,5)) // 3 >fun selectAction(key: Int): (Int, Int) -> Int < // определение возвращаемого результата when(key)< 1 ->return ::sum 2 -> return ::subtract 3 -> return ::multiply else -> return ::empty > > fun empty (a: Int, b: Int): Int < return 0 >fun sum(a: Int, b: Int): Int < return a + b >fun subtract(a: Int, b: Int): Int < return a - b >fun multiply(a: Int, b: Int): Int

Здесь функция selectAction принимает один параметр - key, который представляет тип Int . В качестве возвращаемого типа у функции указан тип (Int, Int) -> Int . То есть selectAction будет возвращать некую функцию, которая принимает два параметра типа Int и возвращает объект типа Int.

В теле функции selectAction в зависимости от значения параметра key возвращается определенная функция, которая соответствует типу (Int, Int) -> Int .

Далее в функции main определяется переменная action1 хранит результат функции selectAction . Так как selectAction() возвращает функцию, то и переменная action1 будет хранить эту функцию. Затем через переменную action1 можно вызвать эту функцию.

Поскольку возвращаемая функция соответствует типу (Int, Int) -> Int , то при вызове в action1 необходимо передать два числа, и соответственно мы можем получить результат и вывести его на консоль.

Kotlin передать функцию как параметр

На этом шаге мы закончим изучение этого вопроса .

Параметры функции

Далее идут параметры функции (рисунок 1).

Рис.1. Параметры функции

Параметры определяют имена и типы входных данных, необходимых функции для решения задачи. Функции могут требовать от нуля до нескольких и более параметров. Их количество зависит от того, для какой задачи они были спроектированы.

Чтобы функция formatHealthStatus могла определить, какое сообщение о состоянии здоровья выводить, необходимы переменные healthPoints и isBlessed , потому что условное выражение when должно проверить эти значения. Поэтому в объявлении функции formatHealthStatus эти две переменные указаны как параметры (рисунок 2):

Рис.2. Параметры функции

Для каждого параметра определяется также его тип. healthPoints должно быть целым числом, а isBlessed - булевым значением.

Обратите внимание, что параметры функции всегда доступны только для чтения, то есть в теле функции они не могут менять свои значения. Другими словами, в теле функции параметры - это val , а не var .

Тип возвращаемого значения

Многие функции создают выходные данные; это их основная задача - возвращать значение какого-то типа туда, откуда они вызваны. Последняя часть заголовка функции - это тип возвращаемого значения, который определяет тип выходных данных функции после завершения ее работы.

Тип String возвращаемого значения formatHealthStatus указывает, что функция возвращает строку (рисунок 3).

Рис.3. Тип возвращаемого значения

Тело функции

За заголовком следует тело функции, заключенное в фигурные скобки. Тело - это та часть функции, в которой происходит основное действие. Оно может содержать оператор return , определяющий возвращаемые данные.

В нашем случае команда выделения функции переместила объявление val healthStatus (код, который вы выбирали ранее при запуске программы) в тело функции formatHealthStatus .

Далее следует новая строка return healthStatus . Ключевое слово return указывает компилятору, что функция завершила работу и готова передать выходные данные. Выходные данные в нашем случае - healthStatus . То есть функция вернет значение переменной healthStatus - строку, основанную на логике определения healthStatus .

Область видимости функции

Обратите внимание, что переменная healthStatus объявляется и инициализируется внутри тела функции и ее значение возвращается в конце:

Рис.4. Объявление и возврат переменной healthStatus

Переменная healthStatus является локальной переменной, так как существует только в теле функции formatHealthStatus . Также можно сказать, что переменная healthStatus существует только в области видимости функции formatHealthStatus . Представьте себе область видимости как продолжительность жизни переменной.

Так как она существует только в области видимости функции, переменная healthStatus прекратит свое существование после завершения работы функции formatHealthStatus .

Это верно и для параметров функции: переменные healthPoints и isBlessed существуют только внутри области видимости функции и исчезают после выполнения функцией ее основной задачи. На 16 шаге вы видели пример переменной, которая не была локальной для функции или класса, - переменную уровня файла.

const val MAX_EXPERIENCE: Int = 5000 fun main()

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

Из-за разницы между локальными переменными и переменными уровня файла компилятор выдвигает разные требования к тому, когда им должно присваиваться начальное значение, или, говоря иначе, когда они должны инициализироваться.

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

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

fun main() < val name: String name = "Madrigal" var healthPoints: Int healthPoints = 89 healthPoints += 3 . . . . . >

Если код не обращается к переменной до ее инициализации, компилятор посчитает его допустимым.

На следующем шаге мы рассмотрим вызов функции .

Передача функции другой функции - Kotlin - Ответ 16322645

ЦитатаСообщение от Casper-SC Посмотреть сообщение

ссылка на функцию

ЦитатаСообщение от Casper-SC Посмотреть сообщение

Ссылку на метод

Не могу это поправить. Я привык, что в мире ООП методы, а не функции, по привычке называю методом.

Меню пользователя @ Casper-SC
Читать блог

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Готовые ответы и решения:

Передача функции в параметры на вход другой функции
Здравствуйте! подскажите как передать функцию в параметром другой функции, раньше функции были с.

Передача функции в качестве параметра другой функции
Доброго времени суток, друзья Необходимо параметром функции передать функцию, количество.

Передача функции как параметр другой функции
Можно ли сделать вот так: Сама функция: void test(void first(), void second()); < if.

Передача функции в качестве аргумента другой функции
в книге Харви и Пол Дейтл нашел следующий вариант решения задачи, передачи функции в качестве.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Передача функции, делегата другой функции с параметрами
Здравствуйте, Подскажите пожалуйста, есть ли возможность вызвать функцию класса, указав в.

Передача аргументов из возврата другой функции
Всем доброго времени суток! Пишу первый раз, ибо до этого находил все ответы на вопросы. Суть.

Функции. Как после одного возвратного значения функции отталкиваться от возврата другой функции
Написал код, в котором 2 функции одна возвращает стринговое значение, вторая должна бы вернуть.

Передача локальных переменных одной функции другой
Добрый день, подскажите, как осуществить передачу локальных переменных получаемых в одной функции.

Передача массива другой функции через указатель
Сейчас я изучаю функции и выполняю упражнение по работе с массивом. Задача такая: занести числа в.

Как вызвать функцию с параметром в другой функции в kotlin

У меня есть функция, которая возвращает некоторое значение. В параметре функции я передаю то же значение:

 fun getValue (value:String):String

Как я могу вызвать функцию getValue в другой функции? Например:

fun getResult ()

Отслеживать
17.9k 11 11 золотых знаков 25 25 серебряных знаков 56 56 бронзовых знаков
задан 28 дек 2020 в 9:19
223 1 1 серебряный знак 6 6 бронзовых знаков
А чем не устраивает var a = getValue("Hello")? Или Вам нужно передать функцию в параметре?
28 дек 2020 в 9:31

@ Crush, Мне нужно ,что бы в результате было: a =message . т е мне нужно получить значение, которое возвращает функция getValue

28 дек 2020 в 9:38

ну по логике ведь нужно что-то передать в getValue, либо можно засетить дефолтные значения но тогда результат будет, так же не очень понятно где используется переменная value после присвоения ей значения

28 дек 2020 в 10:26

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В комментариях вам верно ответили. Вызов getValue с параметром вернет то, что нужно. Т.е. в примере var a = getValue("Hello") переменная 'a' будет равна значению, которое вернет функция getValue.

Отслеживать
ответ дан 28 дек 2020 в 16:30
142 6 6 бронзовых знаков

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

lang-kotlin

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *