Готовый перевод "D"iving Into the D Programming Language / Погружение в язык Ди: 1.3 Function Basics
Давайте перейдём от объявления обязательной функции main к тому, как объявлять и другие фунции.
Определение функций схоже с объявлениями в других Алгол-подобных языках: первым задается возвращаемый тип, затем имя функции и, наконец, набор формальных параметров разделенных запятыми и заключенных в скобки.
К примеру, чтобы определить функцию pow, которая принимает два аргумента типа double и int и возвращает double, мы должны написать:
<pre>
double pow(double base, int exponent) {
…
}
</pre>
Каждый параметр функции (base и exponent в примере выше), помимо своего типа, имеет необязательный спецификатор для указания пути передачи параметров при вызове.
По умолчанию, аргументы в функцию pow передаются по значению.
При указании спецификатора ref, параметр напрямую связывается с переданным аргументом, так что если параметр изменяется, это сразу будет видно вне функции.
К примеру:
import std.stdio;
void fun(ref uint x, double y) {
x = 42;
y = 3.14;
}
void main() {
uint a = 1;
double b = 2;
fun(a, b);
writeln(a, " ", b);
}
Эта программа выведет на экран 42 2, потому что x - это ref uint, т.е. присвоение x на самом деле присваивает сразу переменной a.
С другой стороны, присвоение "y" не влияет на внешнюю переменную "b", т.к. "y" - независимая копия "b" внутри функции.
Последние спецификаторы, которые осталось рассмотреть - это in и out.
Попросту говоря, in - это указание функции только смотреть, но не изменять параметр.
Указание out перед аргументом подобно указанию ref с тем исключением, что при out параметр обязательно инициализируется в начале функции значением по умолчанию.
(Каждый тип Т имеет значение по умолчанию, обозначаемое как T.init; Пользовательские типы могут иметь свой собственный init.)
О функциях можно много чего ещё рассказать.
Вы можете передавать функции в другие функции как аргумент, писать вложенные функции, сохранять в функции её внутреннее состояние (полноценное синтаксическое замыкание) и кое-что ещё интересное.
Мы рассмотрим каждую из этих возможностей по очереди.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод
Переведено на Нотабеноиде
http://notabenoid.org/book/42515/164382
Переводчики: thornik, Born2frag86, warchief
Настройки
Готово:
