2017-07-12 17 views
1

私はOption<T>をいくつかの構造体で共有しており、それは変更可能でなければなりません。私が理解しているように、それはその仕事のためのツールなので、RefCellを使用しています。そのコンテンツにアクセス(および変更)するにはどうすればいいですか?Option<T>`RefCell <Option<T>>`の内容を変更するにはどうすればよいですか?

私は次のことを試してみました:

use std::cell::RefCell; 

#[derive(Debug)] 
struct S { 
    val: i32 
} 

fn main() { 
    let rc: RefCell<Option<S>> = RefCell::new(Some(S{val: 0})); 
    if let Some(ref mut s2) = rc.borrow_mut() { 
     s2.val += 1; 
    } 
    println!("{:?}", rc); 
} 

しかし、コンパイラは、私はそれを行うことはできません。

error[E0308]: mismatched types 
    --> <anon>:10:12 
    | 
10 |  if let Some(ref mut s2) = rc.borrow_mut() { 
    |   ^^^^^^^^^^^^^^^^ expected struct `std::cell::RefMut`, found enum `std::option::Option` 
    | 
    = note: expected type `std::cell::RefMut<'_, std::option::Option<S>, >` 
       found type `std::option::Option<_>` 

答えて

4

あなたborrow_mutRefCellコンパイラが言うように、あなたは、RefMutを取得した場合。その中に値を取得するには、単にオペレータderef_mut使用します。

use std::cell::RefCell; 

#[derive(Debug)] 
struct S { 
    val: i32 
} 

fn main() { 
    let rc: RefCell<Option<S>> = RefCell::new(Some(S{val: 0})); 

    if let Some(ref mut s2) = *rc.borrow_mut() { // deref_mut 
     s2.val += 1; 
    } 
    println!("{:?}", rc); 
} 
+1

を私は聞かせていくつかの(S2)= rc.borrow_mut()as_mut(){ 'が、それぞれ独自の場合は'使用して好みます。 – Shepmaster

+0

@Shepmaster私の答えを編集して独自の構文を追加してください。 – Boiethios

関連する問題