2017-01-22 9 views
3

У меня естьВ чем разница между неизменяемыми и изменяемыми ссылками на i32 при добавлении?

fn plus_one(x: &i32) -> i32 { 
    x + 1 
} 

fn plus_one_star(x: &i32) -> i32 { 
    *x + 1 
} 

fn plus_one_mut(x: &mut i32) -> i32 { 
    x + 1 
} 

fn plus_one_mut_star(x: &mut i32) -> i32 { 
    *x + 1 
} 

fn main() { 
    let a: i32 = 5; 
    let mut b: i32 = 5; 

    println!("{:?}", plus_one(&a)); 
    println!("{:?}", plus_one_star(&a)); 
    println!("{:?}", plus_one_mut(&mut b)); 
    println!("{:?}", plus_one_mut_star(&mut b)); 
    // I expect all to print '6' as I never actually mutate b 
} 

Третья функция, plus_one_mut, не может скомпилировать с: error[E0369]: binary operation `+` cannot be applied to type '&mut i32'

Почему эта функция с изменяемой ссылкой не компилировать?

ответ

4

В сообщении об ошибке говорит:

бинарная операция + не может быть применен к типу '& MUT I32'

Это потому, что это не реализовано. Обзор the documentation for i32, вы увидите эти реализации Add:

  • impl Add<i32> for i32
  • impl<'a> Add<i32> for &'a i32
  • impl<'a> Add<&'a i32> for i32
  • impl<'a, 'b> Add<&'a i32> for &'b i32

Вы должны разыменованием &mut i32, чтобы добраться до i32, который действительно имеет Add реализации.

Почему у этого нет такой реализации? Я не уверен. Возможно, вы можете отправить PR в Rust, чтобы добавить его ... Лично я не могу вспомнить, когда-либо нуждался в этом. Обычно, если у вас есть &mut T, это потому, что вы хотите, чтобы обновить его, чтобы у вас было что-то вроде *foo += 1.

+1

Странная вещь, что 'x.add (1)' работает во всех случаях, хотя ... В этом случае возможно принуждение? –

+0

@PaoloFalabella Я не уверен, когда * принуждение * - правильный термин; но да, я предполагаю, что [автоматическое разыменование] (http://stackoverflow.com/q/28519997/155423) вступает в игру там. – Shepmaster

+0

Итак, в этом случае '& T' ведет себя точно так же, как' T'. В целом, хотя я должен разыгрывать все свои неизменные ссылки, прежде чем использовать их? Или это чрезвычайно распространено для реализации большинства методов 'T' для '& T'? – turbulencetoo

 Смежные вопросы

  • Нет связанных вопросов^_^