2016-01-22 16 views

Trả lời

15

Từ The Rust Programming Language phần có tiêu đề `type` Aliases:

Từ khóa type cho phép bạn khai báo một bí danh của loại hình khác:

type Name = String; 

Sau đó, bạn có thể sử dụng loại này như thể là một loại thực:

type Name = String; 
let x: Name = "Hello".to_string(); 

Có nhiều thứ bạn nên đọc, nhưng điều này trả lời câu hỏi.


Như một chút biên tập, tôi không nghĩ rằng bí danh loại phù hợp với nhiều nơi mọi người sử dụng chúng. Giả sử rằng loại Rank của bạn đại diện cho một số việc cần làm với một cỗ bài, tôi đề xuất một số enum hoặc newtype. Lý do là với bí danh loại, bạn có thể làm điều gì đó như sau:

let rank: Rank = 100; 

Điều vô nghĩa đối với một cỗ bài điển hình. Một enum là một bộ hạn chế. Điều này có nghĩa bạn không bao giờ có thể tạo ra một không hợp lệ Rank:

enum Rank { 
    One, Two, Three, Four, Five, 
    Six, Seven, Eight, Nine, Ten, 
    Jack, Queen, King, Ace, 
} 

impl Rank { 
    fn from_value(v: u8) -> Result<Rank,()> { 
     let r = match v { 
      1 => One, 
      2 => Two, 
      // ... 
      _ => return Err(()), 
     }; 
     Ok(r) 
    } 

    fn value(&self) -> u8 { 
     match *self { 
      One => 1, 
      Two => 2, 
      // ... 
     } 
    } 
} 

Một Newtype chỉ là một loại wrapper. Nó tiêu thụ không có thêm không gian so với các loại bọc, nó chỉ cung cấp một loại thực tế mới cho phép bạn thực hiện các phương pháp có thể hạn chế các giá trị hợp lệ. Có thể tạo các giá trị không hợp lệ, nhưng chỉ trong mã của riêng bạn, không phải tất cả mã của khách hàng:

struct Rank(u8); 

impl Rank { 
    fn from_value(v: u8) -> Result<Rank,()> { 
     if v >= 1 && v <= 14 { 
      Ok(Rank(v)) 
     } else { 
      Err(()) 
     } 
    } 

    fn value(&self) -> u8 { 
     self.0 
    } 
} 

Tôi có xu hướng sử dụng bí danh loại là trình giữ chỗ nhanh của các loại. Trong khi viết các ví dụ trên, tôi thực sự đã viết:

type Error =(); 

Và trả lại Result<Rank, Error>, nhưng sau đó nghĩ rằng sẽ gây nhầm lẫn. :-)

Trường hợp khác tôi sử dụng chúng là rút ngắn loại lớn hơn mà tôi không muốn ẩn. Điều này xảy ra với các loại như trình lặp hoặc Result s, bạn có thể see in the standard library. Một cái gì đó như:

type CardResult<T> = Result<T, Error>; 

fn foo() -> CardResult<String> { 
    // .. 
} 
+1

Cảm ơn bạn đã trả lời nhanh chóng và chi tiết! Thông thường tôi rất đồng ý với bạn về việc sử dụng enums để hạn chế các giá trị của tôi với các giá trị sàn tiêu chuẩn. Tuy nhiên, trong trường hợp của tôi, tôi sử dụng thuật ngữ "thẻ" chung, và không chơi bài, vì vậy tôi cần một thứ hạng giá trị không xác định. Tôi có hiểu chính xác rằng tôi nên sử dụng bí danh loại nếu tôi muốn thay thế đơn giản và một loại mới nếu tôi muốn áp dụng các hạn chế/logic bổ sung? –

+0

@ErikUggeldahl có, điều đó nghe có vẻ chính xác. Một kiểu mới cho phép các hạn chế hoặc logic bổ sung, trong khi một bí danh chỉ là vậy, một tên khác cho cùng một thứ. – Shepmaster

+2

@ErikUggeldahl nó không chỉ hạn chế các giá trị. Một bí danh không cung cấp thêm loại an toàn nào vì nó không phải là ...loại mới, nhưng một tên khác cho cùng một loại. Nó có ý nghĩa để bạn có thể tính toán một 'Rank/5' hoặc vượt qua một' Rank' đến một hàm có một 'u8'? Bởi vì một bí danh kiểu cho phép bạn làm điều đó (vì 'Rank' * là * a' u8'). Những gì bạn thường sử dụng bí danh loại cho Rust là để thuận tiện khi bạn có một loại rất dài và phức tạp và muốn tham khảo nó chính xác hơn (nhưng bí danh * là * loại và nên được sử dụng thay cho nó ở khắp mọi nơi) –

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