Zig 函数

関数は、プログラミング言語においてコードを整理し、ロジックを実装するための重要なツールです。

関数はコードを整理するための重要なツールであり、関数を適切に使用することで、コードの可読性と再利用性を高めることができます。

実際のプログラミングでは、必要に応じてさまざまな関数を定義し、特定の機能を実装することができます。

Zigの関数はfnキーワードで定義されます。

基本语法

Zigでは、関数定義の基本構文は次のとおりです:

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

例えば、簡単な関数 printHello を定義して、"Hello, World!" を出力します:

实例

const std = @import("std");

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

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

コンパイル後の出力内容は:

Hello, World!

参数传递

関数は引数を受け取ることができ、これらの引数はさまざまな型の値にすることができます。

引数は関数定義時に列挙され、呼び出し時に関数に渡されます。例えば:

实例

const std = @import("std");

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

fn greet(name: []const u8) void {
    std.debug.print("Hello, {s}!\n", .{name}); // 使用 {s} 格式符来打印字符串切片
}

コンパイル後の出力内容は:

Hello, Alice!

返回值

関数は値を返すことができます。戻り値の型は関数定義で指定され、次のように使用します:return关键字。

例えば、2つの整数の和を計算する関数を定義します:

实例

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;
}

コンパイル後の出力内容は:

3 + 5 = 8

递归

関数は自身を呼び出すことができます。つまり、再帰呼び出しです。

例えば、階乗を計算する再帰関数を定義します:

实例

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);
    }
}

コンパイル後の出力内容は:

5! = 120

函数重载

Zigは、従来の意味での関数オーバーロード(つまり、同じ名前で異なる引数を持つ複数の関数)をサポートしていません。

Zigはジェネリック関数の機能を提供しており、コンパイル時定数パラメータを使用することで、関数オーバーロードに似た効果を実現できます。例えば:

实例

const std = @import("std");

pub fn main() void {
    printValue(i32, 5); // 型を i32 と明示的に指定する
    printValue([]const u8, "Hello"); // 型を明示的に []const u8 と指定する
}

fn printValue(comptime T: type, value: T) void {
    std.debug.print("{any}\n", .{value}); // {any} を使用して異なる型の値を処理する
}

この例では、printValue関数は任意の型の引数を受け取り、引数の型に応じて出力します。

コンパイル後の出力内容は:

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

内联函数

インライン関数とは、コンパイル時に関数のコードを呼び出し箇所に直接挿入し、関数呼び出しのオーバーヘッドを回避するものです。

Zig では、inlineキーワードを使用してインライン関数を定義できます。例えば:

实例

const std = @import("std");

// 定义一个内联函数
inline fn square(x: i32) i32 {
    return x * x;
}

pub fn main() void {
    const result = square(5); // 呼び出し箇所にインライン関数コードを挿入
    std.debug.print("Square of 5 is {}\n", .{result});
}

この例では、square関数はインライン関数として定義されており、コンパイラはそのコードを呼び出し箇所に直接挿入します。

コンパイル後の出力内容は:

Square of 5 is 25
其他扩展