2015-03-23 21 views
7

Tôi mới sử dụng Rust và cố gắng tìm hiểu cách tham chiếu hoạt động. Trong đoạn mã sau đây khi tôi muốn tính toán trên a1i32 Tôi không cần phải dereference nó. Nhưng với b1Box, tôi phải dereference nó.Rust có tự động tham chiếu kiểu nguyên thủy không?

Thực tế cả hai số let a2 = a1 * 2;let a3 = *a1 * 2; đều hoạt động tương tự. Dường như dereferencing trong nguyên thủy là tùy chọn HOẶC trình biên dịch là ngầm làm điều đó cho chúng tôi.

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); 

} 

Ai đó có thể giải thích chức năng này?

Trả lời

5

Tất cả toán tử số học trong Rust được triển khai cho cả giá trị nguyên thủy và tham chiếu đến nguyên thủy ở hai bên toán tử. Ví dụ: xem phần Implementors của std::ops::Mul, đặc điểm kiểm soát ghi đè của toán tử *.

Bạn sẽ thấy một cái gì đó như:

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 

và vân vân và vân vân.

Trong ví dụ của bạn, b1 có một loại &Box<i32> (kiểu số nguyên mặc định), và trong khi Box thực hiện nhiều đặc điểm như một passthrough cho kiểu dữ liệu của nó (ví dụ impl<T: Read> Read for Box<T>), các nhà khai thác số học không phải là trong số đó. Đó là lý do tại sao bạn phải dereference hộp.

+0

Có, các chữ số nguyên không bị ràng buộc mặc định là 'i32'. –

Các vấn đề liên quan