を移動せずに私はこれらの構造体を持っている:アクセスネストされた構造
#[derive(Debug, RustcDecodable)]
struct Config {
ssl: Option<SslConfig>,
}
#[derive(Debug, RustcDecodable)]
struct SslConfig {
key: Option<String>,
cert: Option<String>,
}
は、彼らはtoml
ファイルから充填ます。これは完全に正常に動作します。 Option<T>
が入っているので、unwrap()
に電話するか、match
に電話する必要があります。
しかし、私は次の操作を実行したい場合:
let cfg: Config = read_config(); // Reads a File, parses it and returns the Config-Struct
let keypath = cfg.ssl.unwrap().key.unwrap();
let certpath = cfg.ssl.unwrap().cert.unwrap();
cfg.ssl
がkeypath
に移動しますので、それは動作しません。しかし、なぜそれは動かされますか?キーを取得するにはunwrap()
をssl
に電話します(とunwrap()
)。したがって、key.unwrap()
の結果は移動する必要がありますか?
ポイントがありませんか?これらの構造体をこのように(または他のきちんとした方法で)アクセスできるようにするにはどうすればよいでしょうか? #[derive(Debug, RustcDecodable, Copy, Clone)]
を実装しようとしましたが、これはCopy
をString
に実装する必要があるため動作しません。次に、Copy
〜Vec<u8>
などを実装する必要があります。より便利なソリューションが必要ですか?
'cfg.ssl.as_ref()。map(| ssl |&ssl.key).unwrap()'が短く...ここに書き込む方が良いかどうかはわかりません。 –
@LukasKalbertodt:ちょっと複雑に見えます...もちろん、ここでの問題は「解きほぐさず」です。 –
おそらく 'unwrap'の代わりに' as_ref()。and_then() 'を使って最初のアンラップを避けることができますが、* some *ポイントでOptionをアサートするか、エラーを合理的に処理する必要があります。 – LinearZoetrope