Rustの@を理解します:ベストプラクティスとユースケース
Daniel Hayes
Full-Stack Engineer · Leapcell

Rustの@
記号は、強力なパターンマッチング機能を提供し、変数バインディングをより柔軟かつ表現力豊かにします。この記事では、その基本的な使い方を例を通して紹介し、パフォーマンスに関する考慮事項やベストプラクティスを含む、複雑なシナリオでの応用について掘り下げます。
Enumのバリアント値のバインディング
HTTPステータスコードを表すenumを考えてみましょう。
#[derive(Debug)] enum HttpStatus { Ok, NotFound, Unauthorized, Unknown(u16), // 不明なステータスコード } let status = HttpStatus::Unknown(501); match status { HttpStatus::Ok => println!("リクエストは成功しました"), code @ HttpStatus::Unknown(_) => { println!("不明なステータスコードが発生しました: {:?}", code); } _ => println!("その他のステータス"), }
この例では、@
を使用して、マッチしたHttpStatus::Unknown
バリアントを変数code
にバインドし、print文で使用できるようにしています。
code @
の部分は、マッチしたenumの値をすべて変数code
にバインドするため、ブロック内で後からcode
を参照できます。ここで、status
がUnknown
バリアントの場合、その内部値に関係なく、print操作が実行され、Unknown
とその関連値を含むcode
が表示されます。
範囲のマッチングと値のバインディング
@
記号は、範囲内の値をマッチングし、マッチした値をブランチ内で使用する必要がある場合にも役立ちます。
let number = 9; match number { n @ 1..=10 => println!("数値{}は1から10の間です", n), _ => println!("数値は1から10の範囲にありません"), }
この例は、数値が1から10の範囲内にあるかどうかを確認し、それに応じて出力する方法を示しています。
構造体のデストラクチャリング中に構造体全体をバインドする
パターンマッチング中に構造体の一部をデストラクトし、構造体全体への参照を保持する必要がある場合、@
記号が特に役立ちます。
#[derive(Debug)] struct Point { x: i32, y: i32, } let point = Point { x: 0, y: 7 }; match point { p @ Point { x, y: 0..=10 } => { println!("ポイントは範囲内です, x: {}, y: {}. ポイント: {:?}", x, p.y, p); } _ => println!("ポイントは範囲外です"), }
ここで、Point { x, y: 0..=10 } @ p
は、y
が0から10の間にあるポイントにマッチする뿐만 아니라、p
を介してPoint
インスタンス全体を参照できます。
マッチガードでの@
の使用
@
記号は、マッチガード(if
の後の条件)と組み合わせて、より複雑なマッチングロジックを提供することもできます。
let number = Some(42); match number { Some(n @ 40..=50) if n % 2 == 0 => println!("数値は範囲内にあり、偶数です:{}", n), _ => println!("数値は一致しません"), }
この例では、number
が40から50の範囲内にあり、偶数であるかどうかを確認し、両方の条件が満たされた場合にのみメッセージを出力します。
エラー処理
失敗する可能性のある操作を扱う場合、@
記号はエラー処理ロジックを簡素化するのに役立ちます。
let result: Result<i32, String> = Err("エラーが発生しました".to_string()); match result { Ok(number) => println!("数値:{}", number), Err(msg) @ err => println!("エラー:{}", err), }
ここでは、@ err
を使用して、Err
バリアント内のエラーメッセージを直接バインドします。
パフォーマンスに関する考慮事項
Rustで@
記号を使用しても、通常、パフォーマンスのオーバーヘッドが大幅に発生することはありません。Rustコンパイラは、不要なコピーを最小限に抑えるようにコードを最適化するためです。ただし、高性能またはリソース制約のあるアプリケーションでは、特に大きなデータ構造をパターンマッチングする場合は、その使用法を慎重に評価する必要があります。
ベストプラクティスとよくある間違い
ベストプラクティス
@
は、データ構造全体とその個々のフィールドの両方にアクセスする必要がある場合にのみ使用してください。- コードの明確さと可読性を維持するために、深くネストされたパターンマッチでの
@
の過剰な使用は避けてください。
よくある間違い
@
の不必要な使用は、冗長なコードにつながります。- サポートされていないデータ型で
@
を誤って使用しようとすること。