Option<String>
計算からを取得することが非常に多く、この値またはデフォルトのハードコードされた値のいずれかを使用したいと考えています。
これは整数の場合簡単です:
let opt: Option<i32> = Some(3);
let value = opt.unwrap_or(0); // 0 being the default
しかし、 aString
と aの場合&str
、コンパイラは型の不一致についてエラーを出します。
let opt: Option<String> = Some("some value".to_owned());
let value = opt.unwrap_or("default string");
ここでの正確なエラーは次のとおりです:
error[E0308]: mismatched types
--> src/main.rs:4:31
|
4 | let value = opt.unwrap_or("default string");
| ^^^^^^^^^^^^^^^^
| |
| expected struct `std::string::String`, found reference
| help: try using a conversion method: `"default string".to_string()`
|
= note: expected type `std::string::String`
found type `&'static str`
1 つのオプションは、rustc が提案しているように、文字列スライスを所有された文字列に変換することです。
let value = opt.unwrap_or("default string".to_string());
しかし、これにより割り当てが発生し、次の呼び出しのように、結果をすぐに文字列スライスに変換したい場合には望ましくありませんRegex::new()
。
let rx: Regex = Regex::new(&opt.unwrap_or("default string".to_string()));
この割り当てを回避するには、Option<String>
を に変換します。Option<&str>
これを慣用的に書くとしたら何でしょうか?
ベストアンサー1
Rust 1.40の時点では、標準ライブラリにはOption::as_deref
これをする:
fn main() {
let opt: Option<String> = Some("some value".to_owned());
let value = opt.as_deref().unwrap_or("default string");
}
参照: