Skip to content

標準庫リファレンス ​

YaoXiang 標準庫(std)はモジュール単位で組織され、各モジュールは use でインポート後、モジュール名.関数名(...) で呼び出します。本ディレクトリはモジュールごとに分割された API リファレンスドキュメントです。

モジュール索引 ​

モジュールエクスポート数説明
std.convert11任意値から String への変換
std.dict11辞書の読み書き、キー値ビュー、マージ
std.io7標準出力、標準入力、ファイル全体の読み書き
std.math18整数、浮動小数点数、三角関数、PI/E/TAU 定数を含む
std.string19文字列の検索、分割、フォーマット、解析
std.time14タイムスタンプ、フォーマット、DateTime フィールドへのアクセス
std.result9Result と Error の構築と分解
std.range10区間反復、述語、遅延アダプタ
std.assert1アサーション
std.net4HTTP リクエストと URL パーセントエンコード/デコード
std.concurrent3スリープ、スケジューリングの譲渡、スレッド識別子
std.os22ファイルハンドル、ディレクトリ、環境変数、作業ディレクトリ
std.weak2Arc / Weak 弱参照

インポート規約 ​

モジュールの全体インポート:

yaoxiang
use std.list
use std.string

main: () -> Void = {
    parts = string.split("a,b,c", ",")
    println(list.len(parts))
}

モジュールから名前でインポートすることも可能で、定数も対象にできます:

yaoxiang
use std.assert
use std.math.{E, PI, TAU}

main: () -> Void = {
    assert(PI > 3.14)
}

引数借用規約 ​

シグネチャ中の & は読み取り専用自動借用(RFC-009 §2.8)を示します:呼び出し元が渡した変数はムーブされず、呼び出し後も引き続き使用可能です。これは標準庫の多くの読み取り専用関数のデフォルト形式です。

yaoxiang
use std.assert
use std.list

main: () -> Void = {
    nums = [1, 2, 3]

    // 3か所の呼び出しはすべて nums を読み取り専用借用し、後でも使用可能
    assert(list.len(nums) == 3)
    assert(list.len(nums) == 3)
    assert(list.contains(nums, 2))
}

& のない引数は値渡しを示します。多くの「変更」関数はそのため、ソース値を消費して新しい値を返す関数型形式であり、インプレース変更ではありません:

yaoxiang
use std.assert
use std.list

main: () -> Void = {
    base = [1, 2]
    extended = list.push(base, 3)   // 新しいリストを返す。base はムーブ済み
    assert(list.len(extended) == 3)
}

各モジュールページの「意味分類」セクションには、そのモジュールのどの関数が借用し、消耗し、インプレース変更するかが記載されています。特に注意すべき点が一つあります:

  • list.pop / list.remove_at のシグネチャは &List(A) と記載されていますが、実際にはリストをインプレース変更します

エラーモデル ​

標準庫には2種類の失敗形態があり、各関数のエントリにはそれぞれ「エラー」と「戻り値」として記載されます:

形態動作典型的なシナリオ
ランタイムエラーをスローE6xxx コードで現在の実行を終了辞書のキー欠如 E6008、インデックス範囲外 E6003、アサーション失敗
センチネル値を返す中断せず、Void / -1 / "" を返すリストの境界外読み取り、空リストの先頭要素取得、環境変数の欠如

一般的なランタイムエラーコード:

エラーコード意味トリガー例
E6003インデックス範囲外list.set(l, 99, v)
E6005アサーション失敗assert(false)
E6007汎用ランタイムエラーファイルが存在しない、result.unwrap の失敗
E6008キー欠如dict.get(d, "nope")
E6010整数解析失敗(Err 値として)string.parse_int("abc")
E6011浮動小数点解析失敗(Err 値として)string.parse_float("abc")

エラーコードの全表はエラーコードリファレンスを参照してください。

string.parse_int / string.parse_float は第3の形態に属します:エラーをスローせず、失敗を Result の Err 値としてラップして返し、std.result で分解するか ? で伝播できます。

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    assert(result.is_ok(string.parse_int("42")))
    assert(result.is_err(string.parse_int("abc")))
}

反復プロトコル ​

std.list と std.range は同じイテレータプロトコルを提供します。イテレータ自体は Tuple 状態キャリアです。

ムーブセマンティクス:next と has_next はどちらもイテレータをムーブします(シグネチャに & がありません)。したがって、毎回アクセスするたびに再作成するか、for ... in を直接使用してください。

yaoxiang
use std.assert
use std.list

main: () -> Void = {
    it = list.iter([1, 2, 3])
    assert(list.has_next(it))

    // has_next が it をムーブしたため、要素取得の前に再作成
    it2 = list.iter([1, 2, 3])
    assert(list.next(it2) == 1)
}

日常的な走査は for ... in を直接使用します:

yaoxiang
use std.assert

main: () -> Void = {
    mut sum = 0
    for x in [1, 2, 3] {
        sum = sum + x
    }
    assert(sum == 6)
}

range.map / range.filter は遅延アダプタを返し、collect / reduce / for_each / for ... in で消費された後に結果が生成されます:

yaoxiang
use std.assert
use std.list
use std.range
use std.result

main: () -> Void = {
    doubled = range.collect(range.map(result.unwrap(range.iter(1..4)), x => x * 2))
    assert(list.get(doubled, 0) == 2)
    assert(list.len(doubled) == 3)
}

プラットフォーム可用性 ​

以下はオペレーティングシステムの機能に依存するもので、wasm32 ターゲットではエクスポートされません:

範囲必要
std.os 全体、std.net 全体、std.weak 全体ファイル/ネットワーク
std.concurrent 全体スレッド
std.io.read_line / read_file / write_file / append_file標準 I/O
std.time.sleepスレッドスリープ

std.string / std.list / std.dict / std.math / std.convert / std.result / std.range / std.assert および std.io.print / println / format_fallback はすべてのターゲットで利用可能です。

実装済みのギャップ ​

以下の問題はドキュメント執筆時に実例を一つずつ実測して確認済みで、すべて issue で追跡中です。

修正済み(2026-09-19):#337 / #338 / #339 / #340 の4項目はすべて修正済みで、対応するページ本文は通常の使用方法の説明に同期して書き換え済みです:

位置元の問題修正
os.openハンドルが使い切りで、open→write→close がコンパイル不可ハンドルは参照渡しに変更 ✅
time.datetime_*8つのアクセサがソースコードから呼び出せない(エクスポート名に :: が含まれる)フラット名 datetime_year などに変更 ✅
time.parse_timefmt 引数が無視され、戻り値が使用できないfmt に基づいてステップ単位で解析 ✅
math.clampmin > max でインタプリタが panic を起こしエラーを返さないE6007 を返す ✅

未解決:

位置問題追跡
net.http_get / http_postプレースホルダ実装で、リクエストを送信せず説明文字列を返す#56

ドキュメント保守 ​

本ディレクトリは生成 + 手書きの混合構造です:

  • 生成領域(<!-- stdlib:KEY start/end --> マーカー間):関数一覧表とシグネチャブロックは StdModule::exports() から派生します。シグネチャはバイト単位で NativeExport::signature から取得されるため、実装とドリフトすることは不可能です。
  • 手書き領域(マーカー外):モジュールの概要、借用/ムーブセマンティクス、エラーモデル、既知のギャップ、サンプル。

ゲート(CI 内で cargo test --lib と共に実行):

ゲートテスト役割
ドリフト検出test_stdlib_docs_match_generation生成領域は exports() と一致する必要がある
孤立検出test_stdlib_docs_has_no_orphan_module_pagesモジュールページはジェネレータ出力を超えてはならない
カバレッジtest_stdlib_docs_covers_interface_modulesドキュメントモジュールセットはインターフェースビューをカバーする必要がある
サンプル実行可能test_stdlib_docs_examples_run各 ```yaoxiang サンプルは実際に実行可能でなければならない

exports() 変更後、修復ツールで生成領域を書き換えます:

bash
cargo run --example gen-stdlib-docs

これは gen-std-interfaces(RFC-037 インターフェースビュー)、tools/code-tables --fix(RFC-013 コードテーブル)と同型です。

関連ドキュメント ​