function_basic
『Zig』では fn キーワードを使って関数を定義します。引数の型・戻り値の型をすべて明示する静的型付けが特徴で、return で値を返します。ここでは関数の定義・呼び出し・戻り値の基本を解説します。
構文
// -----------------------------------------------
// fn — 関数の定義
// -----------------------------------------------
fn 関数名(引数名: 引数の型, ...) 戻り値の型 {
// 処理
return 戻り値;
}
// pub を付けると他のファイルから呼び出せます(公開関数)
pub fn 関数名(引数名: 引数の型) 戻り値の型 {
return 戻り値;
}
// 戻り値がない場合は void を指定します
fn 関数名() void {
// 処理のみ、return は省略できます
}
// エラーを返す可能性がある関数は !戻り値の型 と書きます
fn 関数名() !void {
try 何らかの処理();
}
構文一覧
| 構文/キーワード | 概要 |
|---|---|
fn 名前() 型 { } | 関数を定義します。引数と戻り値の型をすべて明示します。 |
pub fn | 公開関数を定義します。他のファイルや main() から呼び出せます。 |
return 値; | 関数の実行を終了して呼び出し元に値を返します。 |
void | 戻り値がないことを示す型です。return; を省略できます。 |
!void / !型 | エラーユニオン型です。エラーを返す可能性がある関数に使います。 |
try 式 | エラーが返された場合に呼び出し元へエラーを伝播します。 |
引数名: 型 | 引数は名前と型をセットで宣言します。複数の場合はカンマで区切ります。 |
comptime | コンパイル時に値が確定する引数に付けます。ジェネリック関数などで使います。 |
サンプルコード
function_basic.zig
// function_basic.zig — fn(関数の定義と呼び出し)サンプルです
// ドラゴンボールのキャラクターを使って
// 戻り値の型・引数・return の基本的な使い方を確認します
// 標準ライブラリをインポートします
const std = @import("std");
// -----------------------------------------------
// 引数なし・戻り値なしの関数
// pub を付けて main() から呼び出せるようにします
// -----------------------------------------------
pub fn greetGoku() void {
// 標準出力への Writer を取得して出力します
const stdout = std.io.getStdOut().writer();
// print() のエラーは無視する場合は _ で受け取ります
stdout.print("悟空が現れた!\n", .{}) catch {};
}
// -----------------------------------------------
// 引数あり・戻り値あり(整数を返す)関数
// 戦闘力を2倍にして返します
// -----------------------------------------------
pub fn doublePower(power: u32) u32 {
// return で計算結果を呼び出し元に返します
return power * 2;
}
// -----------------------------------------------
// 複数引数を受け取り合計を返す関数
// 2人の戦闘力を合算します
// -----------------------------------------------
pub fn combinedPower(power1: u32, power2: u32) u32 {
return power1 + power2;
}
// -----------------------------------------------
// 文字列スライスを引数・戻り値にする関数
// 名前に「戦士:」プレフィックスを付けた定数を返すのではなく
// 名前をそのまま受け取って挨拶メッセージを表示します
// -----------------------------------------------
pub fn introduce(name: []const u8, power: u32) void {
const stdout = std.io.getStdOut().writer();
stdout.print("名前: {s} 戦闘力: {d}\n", .{ name, power }) catch {};
}
// -----------------------------------------------
// エラーユニオン型を返す関数
// 戦闘力が 0 の場合はエラーを返します
// -----------------------------------------------
const BattleError = error{ZeroPower};
pub fn checkPower(power: u32) BattleError!u32 {
// 戦闘力が 0 ならエラーを返します
if (power == 0) {
return BattleError.ZeroPower;
}
return power;
}
// -----------------------------------------------
// プログラムのエントリポイント
// -----------------------------------------------
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
try stdout.print("=== ドラゴンボール 関数デモ ===\n\n", .{});
// ① 引数なし・戻り値なしの関数を呼び出します
greetGoku();
try stdout.print("\n", .{});
// ② 戻り値を受け取ってから出力します
// ベジータの戦闘力を2倍にします
const vegeta_base: u32 = 9500;
const vegeta_doubled = doublePower(vegeta_base);
try stdout.print("ベジータの戦闘力: {d} → 2倍: {d}\n", .{ vegeta_base, vegeta_doubled });
// ③ 複数引数を渡して合計を得ます
// 悟空とピッコロの合算戦闘力を計算します
const goku_power: u32 = 9000;
const piccolo_power: u32 = 3500;
const total = combinedPower(goku_power, piccolo_power);
try stdout.print("悟空({d}) + ピッコロ({d}) = 合算戦闘力: {d}\n\n", .{ goku_power, piccolo_power, total });
// ④ 文字列と整数を引数に渡してキャラクター情報を表示します
try stdout.print("--- キャラクター一覧 ---\n", .{});
introduce("悟空", 9000);
introduce("ベジータ", 9500);
introduce("ピッコロ", 3500);
introduce("トランクス", 5000);
introduce("フリーザ", 530000);
// ⑤ エラーユニオン型を返す関数を try で呼び出します
// 正常な戦闘力の場合は値が返ります
try stdout.print("\n--- エラーハンドリング付き戦闘力チェック ---\n", .{});
const frieza_power = checkPower(530000) catch |err| {
try stdout.print("エラー: {}\n", .{err});
return;
};
try stdout.print("フリーザの戦闘力チェック OK: {d}\n", .{frieza_power});
// 戦闘力 0 のケースでエラーが返ることを確認します
const zero_result = checkPower(0);
if (zero_result) |val| {
try stdout.print("戦闘力: {d}\n", .{val});
} else |err| {
try stdout.print("エラー発生: {}\n", .{err});
}
}
zig run function_basic.zig === ドラゴンボール 関数デモ === 悟空が現れた! ベジータの戦闘力: 9500 → 2倍: 19000 悟空(9000) + ピッコロ(3500) = 合算戦闘力: 12500 --- キャラクター一覧 --- 名前: 悟空 戦闘力: 9000 名前: ベジータ 戦闘力: 9500 名前: ピッコロ 戦闘力: 3500 名前: トランクス 戦闘力: 5000 名前: フリーザ 戦闘力: 530000 --- エラーハンドリング付き戦闘力チェック --- フリーザの戦闘力チェック OK: 530000 エラー発生: error.ZeroPower
概要
『Zig』の関数は fn 関数名(引数: 型) 戻り値の型 { } の形式で定義します。引数と戻り値の型はすべて明示が必須で、型推論は行われません。戻り値がない場合は void、エラーを返す可能性がある場合は !void や !u32 のようにエラーユニオン型を指定します。pub を付けた関数は他のファイルや main() から呼び出せる公開関数になります。サンプルの doublePower() や combinedPower() のように単純な計算を行う関数は return 式; で値を返します。エラーユニオン型を返す checkPower() のような関数は、呼び出し側で try を使うか catch でエラーを捕捉します。関数に関連する詳細は エラーユニオン型 も合わせて確認してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。