Funciones Zig

Las funciones son herramientas importantes en los lenguajes de programación para organizar el código e implementar la lógica.

Las funciones son herramientas importantes para organizar el código; un uso adecuado de las funciones puede mejorar la legibilidad y la reutilización del código.

En la programación real, se pueden definir varias funciones según sea necesario para implementar funcionalidades específicas.

Las funciones en Zig se definen mediante lafnpalabra clave.

Sintaxis básica

En Zig, la sintaxis básica para definir una función es la siguiente:

fn 函数名(参数列表) 返回类型 {
    // 函数体
}

Por ejemplo, definir una función simple printHello que imprima "Hello, World!":

Ejemplo

const std = @import("std");

pub fn main() void {
    printHello();
}

fn printHello() void {
    std.debug.print("Hello, World!\n", .{});
}

Después de compilar, la salida es:

Hello, World!

Paso de parámetros

Las funciones pueden aceptar parámetros, que pueden ser valores de varios tipos.

Los parámetros se enumeran en la definición de la función y se pasan a la función al llamarla, por ejemplo:

Ejemplo

const std = @import("std");

pub fn main() void {
    greet("Alice");
}

fn greet(name: []const u8) void {
    std.debug.print("Hello, {s}!\n", .{name}); // Usa el especificador de formato {s} para imprimir un slice de cadena
}

Después de compilar, la salida es:

Hello, Alice!

Valor de retorno

Las funciones pueden devolver un valor; el tipo de retorno se especifica en la definición de la función usando lareturnpalabra clave.

Por ejemplo, definir una función que calcule la suma de dos enteros:

Ejemplo

const std = @import("std");

pub fn main() void {
    const result = add(3, 5);
    std.debug.print("3 + 5 = {}\n", .{result});
}

fn add(a: i32, b: i32) i32 {
    return a + b;
}

Después de compilar, la salida es:

3 + 5 = 8

Recursión

Una función puede llamarse a sí misma, es decir, una llamada recursiva.

Por ejemplo, definir una función recursiva que calcule el factorial:

Ejemplo

const std = @import("std");

pub fn main() void {
    const result = factorial(5);
    std.debug.print("5! = {}\n", .{result});
}

fn factorial(n: i32) i32 {
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

Después de compilar, la salida es:

5! = 120

Sobrecarga de funciones

Zig no admite la sobrecarga de funciones en el sentido tradicional (es decir, múltiples funciones con el mismo nombre pero diferentes parámetros).

Zig proporciona la funcionalidad de funciones genéricas; mediante el uso de parámetros constantes en tiempo de compilación, se puede lograr un efecto similar a la sobrecarga de funciones, por ejemplo:

Ejemplo

const std = @import("std");

pub fn main() void {
    printValue(i32, 5); // Especifica explícitamente el tipo como i32
    printValue([]const u8, "Hello"); // Especifica explícitamente el tipo como []const u8
}

fn printValue(comptime T: type, value: T) void {
    std.debug.print("{any}\n", .{value}); // Usa {any} para manejar valores de diferentes tipos
}

En este ejemplo, la función printValue puede aceptar parámetros de cualquier tipo e imprimir según el tipo de parámetro.

Después de compilar, la salida es:

5
{ 72, 101, 108, 108, 111 }

Funciones inline

Una función inline se refiere a insertar el código de la función directamente en el punto de llamada durante la compilación, evitando así la sobrecarga de la llamada a la función.

En Zig, se puede usar lainlinepalabra clave para definir funciones inline, por ejemplo:

Ejemplo

const std = @import("std");

// Definir una función inline
inline fn square(x: i32) i32 {
    return x * x;
}

pub fn main() void {
    const result = square(5); // Insertar el código de la función inline en el punto de llamada
    std.debug.print("Square of 5 is {}\n", .{result});
}

En este ejemplo, la función square se define como una función inline, y el compilador insertará su código directamente en el punto de llamada.

Después de compilar, la salida es:

Square of 5 is 25
Otras extensiones