coding-rust について
coding-rust は Rust 開発者向けのプログラミングスキルです。所有権、非同期処理、エラー処理、Cargo ワークスペースを扱い、システムコードや複数 crate の開発に役立ちます。
主な機能
- 01所有権とライフタイムの管理
- 02トレイトと多態性の実装
- 03Tokio による非同期タスク
- 04anyhow と thiserror によるエラー処理
- 05Cargo ワークスペースの構成
- 06unsafe の慎重な使用
活用シーン
- 01借用安全な Rust コードの作成
- 02Tokio を使った非同期プログラムの構築
- 03複数 crate プロジェクトの整理
- 04CLI ツールのエラー処理設計
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ alphaonedev/ openclaw-graph --skill coding-rustインストール後、Claude Code で/coding-rustを入力して読み込まれたか確認します。
詳細
coding-rust
目的
このスキルは、高度な Rust プログラミングの専門知識を提供します。中核となる言語機能とエコシステムのツールに重点を置き、効率的で安全なシステムコードの構築を支援します。
使用する場面
- 所有権、借用、ライフタイムを用いて、データ競合などの一般的なエラーを防ぐメモリー安全なコードを実装する場合。
- Tokio による非同期プログラミング、anyhow/thiserror によるエラー処理、または Cargo ワークスペースによる複数クレート構成の管理が必要なプロジェクト。
- パフォーマンスが重要な箇所で unsafe コードを使う場合、またはトレイトでカスタム動作を定義する場合。
主な機能
- Rust の所有権モデルを管理する:参照(&T)とライフタイム('a)を使用して、所有権を移さずにデータを借用します。
- トレイトを実装する:ポリモーフィズムのためにトレイトオブジェクトを定義して使用します。例:
trait Debug { fn fmt(&self); }。 - Tokio で非同期処理を扱う:
tokio::mainとフューチャーを使用して非同期タスクを実行します。 - エラーを管理する:簡単なエラーのラップには anyhow を、カスタムエラー型には thiserror を活用します。
- Cargo ワークスペース:
Cargo.tomlのワークスペースを使用して、依存関係を共有する複数パッケージのプロジェクトを整理します。 - unsafe 操作:安全性に関する不変条件を維持しながら、raw ポインターや FFI に unsafe ブロックを使用します。
使用パターン
- 所有権と借用を扱う場合は、クローンより常に借用を優先します。可変参照には
&mut Tを使い、関数fn borrow lifetimes<'a>(x: &'a i32) -> &'a i32のようにライフタイムを一致させます。 - 非同期タスクでは、Tokio ランタイムを起動します。
tokio::spawnを使ってフューチャーを並行実行し、非同期 main 関数で結果を await します。 - 拡張性を高めるためにトレイトを定義します。トレイトを作成して構造体に実装します。例:
impl MyTrait for MyStruct { fn method() { ... } }。 - Cargo ワークスペースを設定します。ルートの
Cargo.tomlに[workspace]セクションを追加し、members = ["crate1", "crate2"]を指定してから、cargo build --workspaceでビルドします。 - エラーには anyhow を使います。エラーを
anyhow::Resultでラップし、?演算子で伝播させます。 - unsafe は必要最小限に使用します。
unsafe { *ptr = value; }のようなブロックで unsafe コードを囲み、コメントでその理由を説明します。
主なコマンド/API
- Cargo コマンド:最適化されたバイナリーを
cargo build --releaseでビルドします。すべてのクレートをcargo test --workspaceでテストします。cargo add tokio --features fullで依存関係を追加します。 - Tokio API:
#[tokio::main] async fn main() { tokio::spawn(async { ... }); }で非同期ランタイムを起動します。非同期通信にはチャネルを使います。例:let (tx, rx) = tokio::sync::mpsc::channel(10);。 - Anyhow/thiserror:
#[derive(thiserror::Error)] enum MyError { ... }でカスタムエラーを定義します。関数ではfn example() -> anyhow::Result<()> { ... }のように処理します。 - 所有権ヘルパー:
std::mem::dropなどの標準ライブラリー関数で値を明示的に破棄するか、所有データまたはコピーされたデータにstd::borrow::Cowを使用します。 - 設定形式:プロジェクト設定には
Cargo.tomlを編集します。例:[dependencies] tokio = { version = "1.0", features = ["full"] }。デバッグにはRUST_BACKTRACE=1などの環境変数を使用します。
統合に関する注意
- 他のツールとの統合:
$RUSTUP_TOOLCHAIN環境変数を使って Rust のバージョンを切り替えます。例:不安定な機能を使うにはexport RUSTUP_TOOLCHAIN=nightlyを実行します。 - 外部連携で API キーを使う場合(Rust から外部サービスを呼び出す場合など)は、
$MY_API_KEYなどの環境変数を設定し、std::env::var("MY_API_KEY").unwrap()で取得します。 - ビルドツールとの連携:CI/CD では、ビルド前に
cargo fmtでコードをフォーマットし、cargo clippyでリントを実行します。 - プロジェクトへの組み込み:
Cargo.tomlに Tokio を依存関係として追加し、コード内でuse tokio::runtime::Runtime; let rt = Runtime::new().unwrap(); rt.block_on(async { ... });を使ってインポートします。 - ワークスペース内のクレート間依存関係を扱う:パスを使ってクレートを参照します。例:
Cargo.tomlでpath = "../sibling_crate"を使用します。
エラー処理
- エラーを手軽に伝播させるには anyhow を使用します:関数から
anyhow::Result<T>を返し、?でエラーを処理します。例:fn read_file() -> anyhow::Result<String> { std::fs::read_to_string("file.txt").context("Failed to read") }。 - thiserror でカスタムエラーを定義します:
#[derive(thiserror::Error, Debug)] enum AppError { #[error("IO error: {0}")] Io(#[from] std::io::Error), }のようにエラーを導出し、match 文で処理します。 - 非同期コンテキストでは、Tokio のエラー型を使用します:Future を await し、
.await.map_err(|e| anyhow::Error::from(e))でエラーを処理します。 - unsafe コードでは、必ずパニックを確認します:unsafe ブロックの周囲で
std::panic::catch_unwindを使用して、クラッシュを防ぎます。
具体的な使用例
- Tokio を使った非同期 HTTP サーバー:
Cargo.tomlに Tokio を追加して簡単なサーバーを作成し、次のように記述します:use tokio::net::TcpListener; #[tokio::main] async fn main() -> anyhow::Result<()> { let listener = TcpListener::bind("127.0.0.1:8080").await?; loop { let (socket, _) = listener.accept().await?; tokio::spawn(handle_connection(socket)); } }。 - CLI ツールでのエラー処理:エラーを定義して anyhow を使用します:
Cargo.tomlにanyhow = "1.0"とthiserror = "1.0"を追加し、次のように実装します:use thiserror::Error; #[derive(Error, Debug)] enum Error { #[error("Parse error")] Parse, } fn main() -> anyhow::Result<()> { let input = std::env::args().nth(1)?; if input.parse::<u32>().is_err() { Err(Error::Parse)?; } Ok(()) }。
グラフの関係性
- 関連項目:コーディング(クラスター)。「coding」などのタグを共有し、プログラミングスキルに焦点を当てています。
- タグを介して接続:「rust」と「systems」のタグを通じて、ほかの Rust またはシステムプログラミングのスキルにつながる可能性があります。
- 依存関係:「coding」クラスターのスキル(エコシステムを幅広くサポートする一般的なコーディングツールなど)と統合される場合があります。
コメント
Markdown 対応