Функции могут выполнять действия. Одна вещь, которую может сделать функция, — это вернуть значение при вызове. Это значение является результатом.
Так, при вызове GetRandomInt(1, 10) можно получить случайное целое число от 1 до 10.
Чтобы изменить тип значения, который требуется получить от функции, необходимо изменить тип в сигнатуре функции. Пример:
GetNumberOfMousetrapsYouCanAfford() : int
В этом примере функция GetNumberOfMousetrapsYouCanAfford() имеет возвращаемый тип int, поэтому всякий раз при вызове GetNumberOfMousetrapsYouCanAfford() в коде можно ожидать, что функция вернёт целое число.
GetNumberOfMousetrapsYouCanAfford() : float
С другой стороны, если изменить тип на float, функция вернёт значение другого типа.
Когда у функции указан возвращаемый тип, тело (блок кода) функции должно выдавать результат, соответствующий этому типу. Если это не так, код не будет компилироваться, то есть возникнет ошибка компилятора. Готовы узнать, как этого избежать?
Результаты и возвращаемые значения
Результат — это значение, которое функция возвращает, когда она выполняется (запускается).
В Уроке 2 были рассмотрены ключевые слова. Это особые, встроенные в Verse слова, с которыми связаны конкретные действия.
В языке Verse, return также является ключевым словом, которое говорит функции выдать значение, являющееся результатом выражения, следующего за ключевым словом return.
MyFunction() : int =
return 5
OnBegin<override>()<suspend> : void =
MyFunction() # result is 5
В приведённом выше примере код возвращает значение 5 при вызове MyFunction().
Отсутствие return не делает функцию неработоспособной, но всё же рекомендуется явно указывать слово return. Дополнительные сведения по этому вопросу см. в разделе Функции.
Досрочный возврат
Когда программа выполняет выражение return, она мгновенно выходит из блока кода функции. Это означает, что если выражение return находится перед другим кодом, то следующий за ним код не будет выполнен. Это может быть полезно для досрочного выхода из функции при выполнении заданного условия.
Следующая функция обновляет переменную Coins на основе значения CoinsPerMouseTrap. Однако, чтобы купить мышеловку, переменная Coins должна содержать положительное значение. Если Coins имеет отрицательное значение, функция выводит сообщение об ошибке и сразу же происходит возврат, поскольку нет смысла выполнять остальной код в теле функции.
Фактически, без возврата функция будет неправильно уменьшать значение Coins и никогда не укажет, что значение Coins стало отрицательным.
var Coins : int = -10
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
Print(“Mousetrap bought! You have {Coins} coins left.”)
Досрочный выход из функции с помощью return может привести к ошибкам, поэтому важно использовать его осторожно. Например, поскольку в следующем коде return выполняется до Print(“Мышеловка куплена! У вас осталось {Coins} монет.”) функция никогда не напечатает новое значение Coins.
var Coins : int = 500
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
return
Print("Mousetrap bought! You have {Coins} coins left.")
Если в вашем коде есть досрочный return, этот код всё равно скомпилируется, но Visual Studio Code предупредит вас, что выражения после return не будут выполняться.
Void для функций без полезного результата
Иногда результат нужен, а иногда в нём нет необходимости.
Если вы помните типы из Урока 2, то вы знаете, что каждому типу требуется определённый вид значения. Ниже приведён краткий список. В Verse используется множество типов, но следующие типы являются наиболее распространёнными и служат основой для использования переменных и констант.
| Тип | Что делает | Значения |
|---|---|---|
| Значение этого типа может быть только истинным или ложным. | true / false |
|
| Целые числа |
| Этот тип предназначен для значений, которые не являются целыми числами, например, для дробей. | Числа с десятичным разделителем |
| Этот тип предназначен для текста любого вида. Это могут быть буквы, цифры, знаки препинания, пробелы и даже эмотиконы. 😻 | Буквы, цифры, знаки препинания, пробелы, эмотиконы |
При создании функции, которая не должна возвращать результат, для неё можно задать тип возвращаемого значения void.
Это означает, что последнее выражение в блоке кода может выдать результат любого типа без возникновения ошибки компилятора, поскольку для функции установлен тип void.
Вы всё равно можете использовать ключевое слово return для функций, имеющих тип void — в этом случае просто не нужно указывать значение с ключевым словом return.
Сводка
Результат — это то, что вы получаете от функции при её вызове.
В блоке кода последнее выражение выдаёт результат.
Чтобы изменить тип значения в функции, необходимо изменить тип в сигнатуре функции.
Return — это ключевое слово, которое говорит функции выдать результат следующего за ней выражения.
Досрочный возврат — это когда ключевое слово return встречается в блоке кода до конца блока. Это приводит к тому, что программа мгновенно выходит из этого блока кода, не выполняя остальной код в блоке.
Void — это тип, который указывает, что значение функции нигде не будет использоваться. Или что просто не стоит беспокоиться об этом. Void можно использовать в качестве типа для функции, которая не должна возвращать результат.