跳转到内容

型システム

此内容尚不支持你的语言。

Sobakasu は静的型付け言語です。変数、式、関数の引数や戻り値などの型をコンパイル時に確認します。型が合わない値を渡したり代入したりするとコンパイルエラーになります。

現在の主な組み込み型は次のとおりです。

Sobakasu 意味
i8 / u8 8 ビット整数
i16 / u16 16 ビット整数
i32 / u32 32 ビット整数
i64 / u64 64 ビット整数
f32 32 ビット浮動小数点数
f64 64 ビット浮動小数点数
char 文字
string 文字列
bool 真偽値
object オブジェクト

このほかに、ユニット型 ()、配列 [T]、タプル (T, U)、ユーザー定義の struct / enum、外部型、ジェネリック型などがあります。

変数などの型を明示するときは : の後ろに型を書きます。

let count: i32 = 0;

関数の戻り値型は -> の後ろに書きます。

function length() -> i32 {
1
}

型を省略できる場所では、初期値や引数などから型が判断されます。必要な型を一つに決められない場合はコンパイルエラーになります。

() は「返す値がない」ことを表すユニット型です。() 自体はユニット型の値でもあります。

let unit: () = ();

戻り値型を省略した関数はユニット型を返します。

配列型は [T]、タプル型は (T1, T2, ...) と書きます。

let values: [i32] = [1, 2, 3];
let pair: (i32, string) = (1, "one");

1 要素のタプルには末尾のカンマが必要です。

let one: (i32,) = (1,);

(i32) は 1 要素タプルではなく、括弧で囲んだ i32 と同じ型です。

Self は implementation の中で、その implementation が対象としている型を表します。

implementation の外で Self を型として使うことはできず、コンパイルエラーになります。

型に別の型を引数として渡す場合は <...> を使います。

Box<i32>
Maybe<string>

詳しくは ジェネリクス を参照してください。

Sobakasu では、値が存在しない可能性を通常の null では表しません。値が存在するかもしれない場合は Maybe<T> を使います。

let empty: Maybe<i32> = Maybe::Nothing;
let value: Maybe<i32> = Maybe::Just(42);

null は現行構文では使用できません。

Sobakasu の型がすべての場所で Udon にそのまま渡せるとは限りません。特に外部 API、public な状態変数、同期する状態変数では、VRChat/Udon 側が対応している型である必要があります。

対応していない型をそのような場所で使用するとコンパイルエラーになります。