2015-03-23 13 views
7

Jestem nowy w Rust i próbuję nauczyć się, jak działają referencje. W poniższym kodzie, gdy chcę wykonać obliczenie na a1, które jest i32, nie muszę tego dereferencji. Ale z b1, który jest Box, muszę go usunąć.Czy Rust automatycznie wyłącza referencje typu pierwotnego?

Właściwie zarówno let a2 = a1 * 2;, jak i let a3 = *a1 * 2; zachowują się podobnie. Wygląda na to, że dereferencje w elementach podstawowych są opcjonalne LUB kompilator domyślnie robi to za nas.

fn main(){ 
    let a = 5; 
    let b = Box::new(10); 
    let a1 = &a; 
    let b1 = &b; 

    println!("{} {}", a1, b1); 

    let a2 = a1 * 2; 
    let b2 = (**b1) * 10; 
    let a3 = *a1 * 2; 

    println!("{} {} {}", a2, a3, b2); 

} 

Czy ktoś może wyjaśnić tę funkcjonalność?

Odpowiedz

5

Wszystkie operatory arytmetyczne w rdzeniu są zaimplementowane dla wartości pierwotnych i odwołań do elementów pierwotnych po obu stronach operatora. Na przykład zobacz sekcję Implementors z std::ops::Mul, cechą, która kontroluje przesłonięcie operatora *.

Zobaczysz coś takiego:

impl Mul<i32> for i32 
impl<'a> Mul<i32> for &'a i32 
impl<'a> Mul<&'a i32> for i32 
impl<'a, 'b> Mul<&'a i32> for &'b i32 

i tak dalej i tak dalej.

W przykładzie b1 ma typ &Box<i32> (domyślny typ Integer), a jednocześnie Box realizuje wiele cech jako passthrough dla jego zamkniętego typu (np impl<T: Read> Read for Box<T>), operatory arytmetyczne nie są wśród nich. Dlatego musisz wyłuskać skrzynkę.

+0

Tak, nieograniczone typy całkowite domyślnie przyjmują wartość "i32". –

Powiązane problemy