10

私はRustが初めてで、所有権/借用の概念に頭を悩ませようとしています。これで、コードをコンパイル エラーを発生させる最小限のコード サンプルに減らしました。

pub struct Display {
    color: Color,
}

pub enum Color {
    Blue         = 0x1,
    Red          = 0x4,
}

impl Display {
    fn get_color_value(&self) -> u16 {
        self.color as u16
    }
}
src/display.rs:12:9: 12:13 error: cannot move out of borrowed content
src/display.rs:12         self.color as u16
                          ^~~~
error: aborting due to previous error
Could not compile.

私はまだ、すべてが価値観によってコピーされているという考え方にとどまってself.colorいますColor。どうやら、私は間違っています。SOでこの同じエラーに関する他の質問を見つけましたが、問題の解決策はありません。

私が理解しているように、フィールドは所有者が所有していDisplayます。への参照を借りただけなので、Display所有していません。の所有権を私に譲渡colorしようとしていますが、私は を所有Colorしていないため、これは不可能Displayです。これは正しいです?

どうすれば解決できますか?

4

1 に答える 1

12

私はまだ、すべてが価値観によってコピーされているという考え方にとどまっています。ここでは、Color のコピーが得られるため、self.color を実行することは完全に合法です。どうやら、私は間違っています。SOでこの同じエラーに関する他の質問を見つけましたが、問題の解決策はありません。

Rust でコピーできるものはすべて、明示的に trait と結合する必要がありますCopyCopy過去には暗黙的でしたが、変更されました ( rfc )。

私が理解しているように、フィールドはディスプレイを所有する人が所有しています。私はディスプレイへの参照を借りただけなので、私はそれを所有していません。色を抽出すると、色の所有権を私に譲渡しようとしますが、私はディスプレイを所有していないため、これは不可能です。これは正しいです?

はい。このエラーが発生した場合、考えられる解決策は 3 つあります。

  • タイプの特性Copyを導出する (適切な場合)
  • 使用/派生Clone( self.color.clone())
  • 参照を返す

これを解決するには、次のように導出CopyColorます。

#[derive(Copy, Clone)]
pub enum Color {
    Blue         = 0x1,
    Red          = 0x4,
}

これは次と同じです。

impl Copy for Color {}
于 2015-03-03T23:22:49.137 に答える