2017-01-03 30 views
1

我試圖通過一個兩個鏈表加起來數字之一:只讀取消引用鏽

use List::*; 

enum List { 
    Cons(i32, Box<List>), 
    Nil, 
} 

impl List { 
    fn stringify(&self) -> String { 
     match *self { 
      Cons(a, ref tail) => format!("{}, {}", a, tail.stringify()), 
      Nil => format!("Nil") 
     } 
    } 
} 

fn dissolve_number(num: i32) -> List { 
    match num { 
     0 => Nil, 
     n => Cons(n % 10, Box::new(dissolve_number(n/10))) 
    } 
} 

fn add_with_inc(a: &List, b: &List, inc: bool) -> List { 
    match (*a, *b, inc) { 
     (Nil, Nil, false) => Nil, 
     (Nil, Nil, true) => Cons(1, Box::new(Nil)), 
     (Nil, Cons(j, ref btail), false) => Cons(j, Box::new(add_with_inc(&Nil, btail, false))), 
     (Nil, Cons(j, ref btail), true) => Cons((j + 1) % 10, Box::new(add_with_inc(&Nil, btail, (j + 1) >= 10))), 
     (Cons(i, ref atail), Nil, false) => Cons(i, Box::new(add_with_inc(atail, &Nil, false))), 
     (Cons(i, ref atail), Nil, true) => Cons((i + 1) % 10, Box::new(add_with_inc(atail, &Nil, (i + 1) >= 10))), 
     (Cons(i, ref atail), Cons(j, ref btail), false) => Cons((i + j) % 10, Box::new(add_with_inc(atail, btail, (i + j) >= 10))), 
     (Cons(i, ref atail), Cons(j, ref btail), true) => Cons((i + j + 1) % 10, Box::new(add_with_inc(atail, btail, (i + j + 1) >= 10))) 
    } 
} 

fn add(a: &List, b: &List) -> List { 
    add_with_inc(a, b, false) 
} 

fn main() { 
    let (la, lb) = (dissolve_number(123), dissolve_number(223)); 
    let lsum = add(&la, &lb); 
    println!("{}", lsum.stringify()); 
} 

編譯器會抱怨:

error[E0507]: cannot move out of borrowed content 
    --> add_two_numbers.rs:25:12 
    | 
25 |  match (*a, *b, inc) { 
    |   ^^ cannot move out of borrowed content 

error[E0507]: cannot move out of borrowed content 
    --> add_two_numbers.rs:25:16 
    | 
25 |  match (*a, *b, inc) { 
    |    ^^ cannot move out of borrowed content 

搜索後,我發現,錯誤是由於解除了借用變量的引用。有沒有辦法從參考中獲得List的只讀副本?

我修改了代碼了一點,但我仍然不能得到它的工作...

fn add_with_inc(a: &List, b: &List, inc: bool) -> List { 
    match (a, b, inc) { 
     (ref Nil, ref Nil, false) => Nil, 
     (ref Nil, ref Nil, true) => Cons(1, Box::new(Nil)), 
     (ref Nil, ref Cons(j, ref btail), false) => Cons(j, Box::new(add_with_inc(&Nil, btail, false))), 
     (ref Nil, ref Cons(j, ref btail), true) => Cons((j + 1) % 10, Box::new(add_with_inc(&Nil, btail, (j + 1) >= 10))), 
     (ref Cons(i, ref atail), ref Nil, false) => Cons(i, Box::new(add_with_inc(atail, &Nil, false))), 
     (ref Cons(i, ref atail), ref Nil, true) => Cons((i + 1) % 10, Box::new(add_with_inc(atail, &Nil, (i + 1) >= 10))), 
     (ref Cons(i, ref atail), ref Cons(j, ref btail), false) => Cons((i + j) % 10, Box::new(add_with_inc(atail, btail, (i + j) >= 10))), 
     (ref Cons(i, ref atail), ref Cons(j, ref btail), true) => Cons((i + j + 1) % 10, Box::new(add_with_inc(atail, btail, (i + j + 1) >= 10))) 
    } 
} 

回答

1

不提領與&作品更換ref

use List::*; 

enum List { 
    Cons(i32, Box<List>), 
    Nil, 
} 

impl List { 
    fn stringify(&self) -> String { 
     match *self { 
      Cons(a, ref tail) => format!("{}, {}", a, tail.stringify()), 
      Nil => format!("Nil") 
     } 
    } 
} 

fn dissolve_number(num: i32) -> List { 
    match num { 
     0 => Nil, 
     n => Cons(n % 10, Box::new(dissolve_number(n/10))) 
    } 
} 

fn add_with_inc(a: &List, b: &List, inc: bool) -> List { 
    match (a, b, inc) { 
     (&Nil, &Nil, false) => Nil, 
     (&Nil, &Nil, true) => Cons(1, Box::new(Nil)), 
     (&Nil, &Cons(j, ref btail), false) => Cons(j, Box::new(add_with_inc(&Nil, btail, false))), 
     (&Nil, &Cons(j, ref btail), true) => Cons((j + 1) % 10, Box::new(add_with_inc(&Nil, btail, (j + 1) >= 10))), 
     (&Cons(i, ref atail), &Nil, false) => Cons(i, Box::new(add_with_inc(atail, &Nil, false))), 
     (&Cons(i, ref atail), &Nil, true) => Cons((i + 1) % 10, Box::new(add_with_inc(atail, &Nil, (i + 1) >= 10))), 
     (&Cons(i, ref atail), &Cons(j, ref btail), false) => Cons((i + j) % 10, Box::new(add_with_inc(atail, btail, (i + j) >= 10))), 
     (&Cons(i, ref atail), &Cons(j, ref btail), true) => Cons((i + j + 1) % 10, Box::new(add_with_inc(atail, btail, (i + j + 1) >= 10))) 
    } 
} 

fn add(a: &List, b: &List) -> List { 
    add_with_inc(a, b, false) 
} 

fn main() { 
    let (la, lb) = (dissolve_number(123), dissolve_number(223)); 
    let lsum = add(&la, &lb); 
    println!("{}", lsum.stringify()); 
}