関数とジェネリクス
関数宣言、戻り値、デフォルト引数、明示的なジェネリック実体化を説明します。
Wave Foundation
関数宣言
fun add(left: i32, right: i32) -> i32 {
return left + right;
}
fun log(message: str) {
println("{}", message);
}
引数は name: type の形式です。値を返す関数は -> type を使い、戻り値の型を省略すると値を返さない関数になります。
return
fun choose(flag: bool) -> i32 {
if (flag) {
return 1;
}
return 0;
}
値を返さない関数では return; を使用できます。
ジェネリック関数
fun identity<T>(value: T) -> T {
return value;
}
fun main() {
var integer: i32 = identity<i32>(10);
var decimal: f64 = identity<f64>(3.14);
}
ジェネリック関数の呼び出しには、明示的な型引数が必要です。型引数を指定せずジェネリックテンプレートを identity(10) のように呼び出すとエラーになります。
ジェネリック構造体
struct Pair<A, B> {
first: A;
second: B;
}
fun main() {
var pair: Pair<i32, f64> = Pair<i32, f64> {
first: 1,
second: 2.5
};
}
具体的な型の組み合わせごとに、専用の関数または構造体定義が生成されます。
デフォルト引数
デフォルト引数には整数、浮動小数点数、文字列のリテラルを使います。末尾の引数にデフォルト値が宣言されている場合、呼び出し側はその引数を省略できます。
fun repeat(value: i32, count: i32 = 1) -> i32 {
return value * count;
}
var result: i32 = repeat(7);
ジェネリクスの規則
- ジェネリック関数の呼び出しには明示的な型引数が必要です。
export(...)で公開する関数をジェネリックにはできません。ptr<T>とarray<T, N>は組み込みのメモリ型であり、ユーザー定義のジェネリックテンプレートではありません。