В прошлом уроке мы рассмотрели словари: https://medium.com/@mikeabelar/web-development-with-hhvm-and-hack-6- dictionaries-f951c9a557f7. В этом руководстве мы рассмотрим функции в Hack.

Что такое функции?

Функции позволяют нам взять код, который служит определенной цели, и поместить этот код в специальный блок кода.

Примеры функций

Рассмотрим пример сложения двух чисел. Скажем, у нас есть следующий код (находится в файле с именем functions.hack):

<<__EntryPoint>>
function main(): noreturn {
 // code here
 $sum = 5 + 4;
 print($sum);
 print("\n");
 exit(0);
}

Когда мы запускаем код (с hhvm functions.hack), код выводит «9». В настоящее время мы складываем 5 и 4 и сохраняем результат в переменной с именем sum. Строка кода для сложения 5 и 4 служит для сложения двух чисел. Давайте посмотрим, что произойдет, если мы возьмем тот же код и используем его с функцией:

function add_two_numbers(int $num_1, int $num_2) : int {
    return $num_1 + $num_2;
}
<<__EntryPoint>>
function main(): noreturn {
 // code here
 $sum = add_two_numbers(5, 4);
 print($sum);
 print("\n");
 exit(0);
}

Давайте сначала посмотрим на объявление созданной нами новой функции:

function add_two_numbers(int $num_1, int $num_2) : int {
    return $num_1 + $num_2;
}

Мы можем объявить новую функцию, начав с ключевого слова function, за которым следует имя функции: add_two_numbers.

Мы заметим, что за именем функции следуют круглые скобки и переменные:

add_two_numbers(int $num_1, int $num_2)

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

Теперь посмотрим, что следует за круглыми скобками:

function add_two_numbers(int $num_1, int $num_2) : int

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

function main(): noreturn

Эта функция имеет noreturn в качестве возвращаемого типа. Это означает, что функция ничего не вернет.

Теперь давайте посмотрим на тело функции:

return $num_1 + $num_2;

Код вернет результат $num_1 и $num_2. Тип возвращаемого значения этого выражения, int, соответствует типу возвращаемого значения функции. Помните, что целое число плюс и целое число дают целое число. Мы возвращаем значение из функции с помощью ключевого слова return. Примечание: после ключевого слова return код не должен идти. Ключевое слово return отмечает конец функции. Функция завершается, когда возвращает значение.

Другие примеры функций:

Следующий код объединяет две строки:

function concat_two_strings(string $string_1, string $string_2) : string {
    return $string_1 . $string_2;
}
<<__EntryPoint>>
function main(): noreturn {
 // code here
 $combined_string = concat_two_strings("Hello ", "World");
 print($combined_string);
 print("\n");
 exit(0);
}

Код печатает: Hello World

Примечание: использование типа string как для параметров, так и для типа возвращаемого значения.

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

function print_twice(string $string_to_print) : void {
    print($string_to_print . "\n");
    print($string_to_print . "\n");
}
<<__EntryPoint>>
function main(): noreturn {
 // code here
 print_twice("Hi!");
 exit(0);
}

Обратите внимание на тип возврата void для функции print_twice. Мы можем использовать возвращаемый тип noreturn только тогда, когда мы включаем вызов функции exit(); в конце функции, как в main. Мы используем void, если ничего не возвращаем и не вызываем exit().

В следующем коде используется функция, которая не принимает параметров и выводит сообщение:

function print_a_message() : void {
    print("Hey!\n");
}
<<__EntryPoint>>
function main(): noreturn {
 // code here
 print_a_message();
 exit(0);
}

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

В следующем уроке мы рассмотрим больше циклов: https://medium.com/@mikeabelar/web-development-with-hhvm-and-hack-8-loops-dbe86a85df4