rust相同方法名调用顺序

rust相同方法名调用顺序,第1张

rust相同方法名调用顺序

1.优先匹配非trait实现,根据调用方式优先匹配

(&var).call()优先匹配&self实现

(&mut var).call()优先匹配&mut self实现

(var).call()优先匹配self实现

测试代码:

struct Nemo;

trait Say {
    fn say(&self);
}

trait SayMut {
    fn say(&mut self);
}

trait Sayonce {
    fn say(self);
}

impl Say for Nemo {
    fn say(&self) {
        println!("say bbb")
    }
}

impl SayMut for Nemo {
    fn say(&mut self) {
        println!("say ccc")
    }
}

impl Sayonce for Nemo {
    fn say(self) {
        println!("say ddd")
    }
}

impl Nemo {
    fn say(&self) {
        println!("say aaa")
    }
    // fn say(&mut self) {
    //     println!("say aaa")
    // }
    // fn say(&mut self) {
    //     println!("say aaa")
    // }
}

fn main() {
    let mut k = Nemo;
    (&k).say();
}
2.匹配trait实现,如果存在trait冲突,则报错
impl Say for Nemo {
    fn say(&self) {
        println!("say bbb")
    }
}

impl Sayonce for &Nemo {
    fn say(self) {
        println!("say ddd")
    }
}

fn main() {
    let mut k = Nemo;
    (&k).say();//multiple `say` found
}
3.Defer/DeferMut匹配,调用后重新匹配规则1、2。 4.转换匹配

self->&mut self

&mut self->& self

如果规则4匹配失败,执行规则3后再次执行规则4。

trait Say {
    fn say(&self);
}

trait SayMut {
    fn say(&mut self);
}

struct Nemo;

impl Nemo {}


impl Say for &mut &mut Nemo {
    fn say(&self) {
        println!("say bbb")
    }
}

impl SayMut for &mut Nemo {
    fn say(&mut self) {
        println!("say ccc")
    }
}

fn main() {
    let mut k: Nemo = Nemo;
    (&mut &mut &mut k).say();
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5683133.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存