Rustの構造体で、nullableなメンバは以下のようにOption型を利用する記述になります。
struct Friend {
name: Option<String>
}
let john = Friend { name: Some("John") };
この変数Johnを関数に渡す際、イミュータブルな参照として&john
を渡すことを第一に考えるケースが多いでしょう。実体を渡してしまうとそこでmoveしてしまい、後続の処理で利用できなくなるのはRustの基本ルールです。
ところが、以下のように素朴にメンバーにアクセスするとエラーになります。
fn (friend: &Friend) -> Option<String> {
let name = friend.name.map(|n| String::from(n))?;
// ...
}
一見コード上は問題なく見えるのですが、Option
このようなケースでは、以下のようにas_ref()
メソッドを経由すると、Option
let name = friend.name.as_ref().map(|n| String::from(n))?;
実務上、NOTNULL制約のないDBデータなどはOption
as_deref()
頻度が少なそうなものの、特定のケースでは as_deref()が必要になります。
Box<[T]>
のOptionから[T]
を取り出すケースでBoxのDerefが必要になり、as_deref()
が求められました。
Box<[T]>
は意図的に使わない限りほぼ遭遇しませんが、Box<[T]>
の取り扱いはドキュメントが乏しいのでやや苦労します。
⁋ 2020/12/27↻ 2024/12/05
中馬崇尋
Chuma Takahiro
Chuma Takahiro