一个 struct 可以实现多个 trait。而多个 trait 的作者无力要求对方不能与自己重名。所以可能会出现如下情况:
trait TraitA {
fn call(&self);
}
trait TraitB {
fn call(&self);
}
struct Struct;
impl TraitA for Struct {
fn call(&self);
}
impl TraitB for Struct {
fn call(&self);
}
这时,Struct
的作者和使用者,调用 s.call()
时会产生歧义。为了消除这种歧义,其作者和使用者需要借用一种语法区分此二函数。
Universal Function Call Syntax
rust 用 <Struct as TraitA>::call(&s)
和 <Struct as TraitB>::call(&s)
来区分这两个调用。尖括号内的部分,指定了 struct 名字和 trait 名字,双冒号之后是函数的名字,而且用显式传递引用的办法将函数绑定的对象传递给了函数。因为使用了尖括号,这一般称作 Angle-Bracket Form。
一般情况下,Struct
可以从 s
的类型得知,所以上述调用可以简写成 TraitA::call(&s)
和 TraitB::call(&s)
。
网友评论