2016-10-16 4 views
3
pub struct Character { 
    name: String, 
    hp: i32, 
    level: i32, 
    xp: i32, 
    xp_needed: i32, 
    gold: i32 
} 

impl Character { 
    pub fn new(name: String) -> Character { 
     let mut rng = thread_rng(); 

     let hp: i32 = rng.gen_range(12, 75); 
     let gold: i32 = rng.gen_range(10, 50); 

     Character { name: name, hp: hp, level: 1, xp: 0, gold: gold, xp_needed: 100 } 
    } 

    pub fn get_name(&self) -> String { 
     self.name 
    } 

    // ... 
} 

ここでルールをどのように厳密に破棄していますか?Rustの借用コンテンツから移動することはできません

高レベルでは、これは錆に対抗しています。自分が所有していないため、借りたものの所有権を譲渡することはできません。

私にはありませんか?私は次のような他の機能を持っています:

pub fn get_hp(&self) -> i32 { 
    self.hp 
} 

これはうまくいきます。

| 
23 |   self.name 
    |   ^^^^ cannot move out of borrowed content 

error: aborting due to previous error 

何が起こっているのですか?文字の名前を返す適切な方法は何ですか? get_hpメソッドは機能しますが、get_nameは機能しないのはなぜですか?

+5

あります[*同じエラーメッセージのように多くの*他の質問](http://stackoverflow.com/search?q=%5Brust%5D+move+out+of+borrowed+content+is %3Aq)。 'i32'は' Copy'、 'String'はそうではありません。あなたは**自分の「自己」を所有していない、それは借りた(「自己」)。 – Shepmaster

+0

@Shepmasterこれは私の質問に答えたり、解決策を教えてくれません。 – TheWebs

+3

TheWebs @Shepmasterは、あなたの質問に何らかの努力を払わなければならないことを意味します。あなたに類似する他の質問がある場合は、その答えがあなたの問題に当てはまらない理由を説明してください。 – mcarton

答えて

8

get_hpget_nameの違いは、get_hpi32を返します。 i32Copyタイプです。 Copyタイプは単純にビットをコピーするだけでコピーでき、決して移動しません。一方、StringCopyではありません。転送される(移動する)か、Clonedのいずれかのメモリを管理します。

このようなゲッターの場合、クローンではなく参照を返す方が慣れています。 Stringの場合は、具体的にはbe &strです。

pub fn get_name(&self) -> &str { 
    &self.name 
} 
関連する問題