標準ライブラリ無しでRustを使う

Rustの標準ライブラリは多くの便利な機能を提供している一方で、 スレッド、ネットワーク、ヒープアロケーション、その他の多くの機能をホストシステムが提供していることを前提としています。 一方で、それらの機能を提供していないシステムも存在します。しかし、Rustはそれらの上でも利用することができます! それは、Rustに標準ライブラリを利用しないということを #![no_std] アトリビュートを利用して伝えることで可能となります。

メモ: このフィーチャーは技術的には安定していますが、いくつか注意点が有ります。 例えば、 #![no_std] を含んだ ライブラリ は 安定版でビルド可能ですが、 バイナリ はビルド不可能です。 標準ライブラリを利用しないバイナリについては #![no_std] についての不安定版のドキュメント を確認してください。

#![no_std] アトリビュートを利用するには、クレートのトップに以下のように追加します:

fn main() { #![no_std] fn plus_one(x: i32) -> i32 { x + 1 } }
#![no_std]

fn plus_one(x: i32) -> i32 {
    x + 1
}

標準ライブラリで提供されている多くの機能は core クレート を用いることでも利用できます。 標準ライブラリを利用しているとき、Rustは自動的に std をスコープに導入し、 標準ライブラリの機能を明示的にインポートすること無しに利用可能にします。 それと同じように、もし #![no_std] を利用しているときは、 Rustは自動的に coreそのプレリュード をスコープに導入します。 これは、例えば多くの以下のようなコードが動作することを意味しています:

fn main() { #![no_std] fn may_fail(failure: bool) -> Result<(), &'static str> { if failure { Err("this didn’t work!") } else { Ok(()) } } }
#![no_std]

fn may_fail(failure: bool) -> Result<(), &'static str> {
    if failure {
        Err("this didn’t work!")
    } else {
        Ok(())
    }
}