mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-05-18 23:03:06 +08:00
Translate everything-claude-code repository to Japanese including: - 17 root documentation files - 60 agent documentation files - 80 command documentation files - 99 rule files across 18 language directories (common, angular, arkts, cpp, csharp, dart, fsharp, golang, java, kotlin, perl, php, python, ruby, rust, swift, typescript, web) - 199 skill documentation files Total: 455 files translated to Japanese with: - Consistent terminology glossary applied throughout - YAML field names preserved in English (name, description, etc.) - Code blocks and examples untouched (comments translated) - Markdown structure and relative links preserved - Professional translation maintaining technical accuracy This translation expands ECC accessibility to Japanese-speaking developers and teams. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
5.1 KiB
5.1 KiB
paths
| paths | |
|---|---|
|
Rust コーディングスタイル
このファイルは common/coding-style.md を Rust 固有のコンテンツで拡張します。
フォーマット
- 強制には rustfmt を使用 — コミット前に必ず
cargo fmtを実行する - リントには clippy を使用 —
cargo clippy -- -D warnings(警告をエラーとして扱う) - 4スペースインデント(rustfmt デフォルト)
- 最大行幅: 100文字(rustfmt デフォルト)
不変性
Rust の変数はデフォルトで不変 — これを活用する:
- デフォルトで
letを使用する。ミューテーションが必要な場合にのみlet mutを使用する - その場でのミューテーションよりも新しい値を返すことを優先する
- 関数が割り当てる必要があるかどうかわからない場合は
Cow<'_, T>を使用する
use std::borrow::Cow;
// 良い例 — デフォルトで不変、新しい値を返す
fn normalize(input: &str) -> Cow<'_, str> {
if input.contains(' ') {
Cow::Owned(input.replace(' ', "_"))
} else {
Cow::Borrowed(input)
}
}
// 悪い例 — 不要なミューテーション
fn normalize_bad(input: &mut String) {
*input = input.replace(' ', "_");
}
命名
標準的な Rust の規約に従う:
- 関数、メソッド、変数、モジュール、クレートには
snake_case - 型、トレイト、列挙型、型パラメータには
PascalCase(UpperCamelCase) - 定数とスタティックには
SCREAMING_SNAKE_CASE - ライフタイム: 短い小文字(
'a、'de)— 複雑な場合は説明的な名前('input)
所有権と借用
- デフォルトで借用(
&T)する。格納または消費する必要がある場合にのみ所有権を取得する - 根本原因を理解せずにボローチェッカーを満たすためにクローンしない
- 関数パラメータでは
Stringよりも&str、Vec<T>よりも&[T]を受け入れる Stringを所有する必要があるコンストラクタにはimpl Into<String>を使用する
// 良い例 — 所有権が不要な場合は借用する
fn word_count(text: &str) -> usize {
text.split_whitespace().count()
}
// 良い例 — Into を使用してコンストラクタで所有権を取得する
fn new(name: impl Into<String>) -> Self {
Self { name: name.into() }
}
// 悪い例 — &str で十分なのに String を取得する
fn word_count_bad(text: String) -> usize {
text.split_whitespace().count()
}
エラーハンドリング
- 伝搬には
Result<T, E>と?を使用する — 本番コードではunwrap()を使わない - ライブラリ:
thiserrorで型付きエラーを定義する - アプリケーション: 柔軟なエラーコンテキストには
anyhowを使用する .with_context(|| format!("failed to ..."))?でコンテキストを追加するunwrap()/expect()はテストと本当に到達不可能な状態にのみ使用する
// 良い例 — thiserror によるライブラリエラー
#[derive(Debug, thiserror::Error)]
pub enum ConfigError {
#[error("failed to read config: {0}")]
Io(#[from] std::io::Error),
#[error("invalid config format: {0}")]
Parse(String),
}
// 良い例 — anyhow によるアプリケーションエラー
use anyhow::Context;
fn load_config(path: &str) -> anyhow::Result<Config> {
let content = std::fs::read_to_string(path)
.with_context(|| format!("failed to read {path}"))?;
toml::from_str(&content)
.with_context(|| format!("failed to parse {path}"))
}
ループよりもイテレータ
変換にはイテレータチェーンを優先する。複雑な制御フローにはループを使用する:
// 良い例 — 宣言的で合成可能
let active_emails: Vec<&str> = users.iter()
.filter(|u| u.is_active)
.map(|u| u.email.as_str())
.collect();
// 良い例 — 早期リターンを伴う複雑なロジックにはループ
for user in &users {
if let Some(verified) = verify_email(&user.email)? {
send_welcome(&verified)?;
}
}
モジュール構成
型ごとではなく、ドメインごとに整理する:
src/
├── main.rs
├── lib.rs
├── auth/ # ドメインモジュール
│ ├── mod.rs
│ ├── token.rs
│ └── middleware.rs
├── orders/ # ドメインモジュール
│ ├── mod.rs
│ ├── model.rs
│ └── service.rs
└── db/ # インフラストラクチャ
├── mod.rs
└── pool.rs
可視性
- デフォルトはプライベート。内部共有には
pub(crate)を使用する - クレートのパブリック API の一部であるものだけに
pubを付ける lib.rsからパブリック API を再エクスポートする
参考
包括的な Rust のイディオムとパターンについてはスキル: rust-patterns を参照。