使用类型作为不同的名称和类型别名有什么区别?

Vic*_*voy 7 rust

有什么区别

use hyper::status::StatusCode as Error;
Run Code Online (Sandbox Code Playgroud)

type Error = hyper::status::StatusCode;
Run Code Online (Sandbox Code Playgroud)

他们之间是否还有其他差异,除此之外也type可以pub type?使用这一个或另一个有什么好处?

Vla*_*eev 7

在简单类型的情况下,如在您的示例中,似乎没有任何语义差异.此外,还有一个直接模拟与usepub type,它是pub use:

// will be available to other modules
pub use hyper::status::StatusCode as Error;
Run Code Online (Sandbox Code Playgroud)

但是,在更复杂的情况下存在差异.例如,您可以为专用泛型类型定义泛型类型别名或别名:

type Result<T> = ::std::result::Result<T, MyError>;

type OptionI32 = Option<i32>;
Run Code Online (Sandbox Code Playgroud)

一般的想法是你通常使用类型别名,因为它们更强大,并且更明确地建议意图,比如Result,use .. as ..当你只想导入那个特定的名称时它会使用,但它与当前命名空间中已有的东西冲突:

use std::io::Read as StdRead;

trait Read: StdRead { ... }
Run Code Online (Sandbox Code Playgroud)

请注意,使用路径限定标识符应优先use重命名.以上写得更好

use std::io;

trait Read: io::Read { ... }
Run Code Online (Sandbox Code Playgroud)

(当然,除非Read方法用于同一文件中的某些具体类型).

使用use .. as ..替代type(在可能的情况下)是不常见的,我认为应该避免.