Готовый перевод "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

Настройки

Готово:

100.00% КП = 1.0