查看: 47|回复: 0

rust学习二十.7、RUST完全限定名以及静态方法

[复制链接]

3

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2009-6-16
发表于 2025-3-31 16:55:00 | 显示全部楼层 |阅读模式

rust中看不到java等一些OOP语言的中用于修饰方法的static之类的关键字眼。

注:rust有static关键字,目前是用于修饰生命周期的或者是变量的

例如:

let leaked_str: &'static str = Box::leak(tmp.into_boxed_str());
static mut SIGN: u32 = 0;
 
先给出完全限定语法:
<Type as Trait>::function(receiver_if_method, next_arg, ...);
 
为什么需要这个语法,直接原因是:特质和实现特定特质的类型中都存在同样的方法,必须通过完全限定的方式告诉Rust执行哪个方法。
 

一、例子

本例对于书上的例子稍微进行了改造.

trait Fight{
    fn fight(&self);
    fn rest();
}

struct Student{
    name:String
}
impl  Student{
    /**
     * fight是关联函数,因为它带有self参数,所以不能直接调用特质中的同名方法,
     * 必须通过实例调用
     */
    fn fight(&self){
        println!("{} 在独斗.十步杀一人,千里不留行", self.name);
    }
    /**
     * rest是静态方法,不是关联方法,可以直接通过类型调用
     * 所以不能通过实例调用,只能通过类型调用
     */
    fn  rest(){
        println!("休息一下");
    }
}
impl Fight for Student{
    fn fight(&self){
        println!("{} 在团战.", self.name);
    }
    fn rest(){
        println!("大家休息一下");
    }
}

fn main() {
    let stu = Student{name:"小明".to_string()};
    // 三种调用方式,调取不同的方法
    // 1.实例后跟上方法
    // 2.特质名::方法(&实例)
    // 3.<Type as Trait>::function(receiver_if_method, next_arg, ...);

    stu.fight();//1.实例跟上方法
    Fight::fight(&stu);   //2.特质名::方法(&实例) -- 实际是调用特质的方法
    <Student as Fight>::fight(&stu);  //3.特质名::方法(&实例) -- 实际是调用对象实例的方法

    Student::rest();  //4.类型的静态方法
    <Student as Fight>::rest();
}

在本例中有一个类型Student和一个特质Fight.

Student和Fight都有方法fight和rest,其中rest是无参数。Student.reset本质上就是一个类型Student的静态方法,即使不实例化也可以调用。

看运行结果:

 

二、小结

1.rust的类型可以有静态方法,不需要实例化即可执行,但是rust并没有使用类似static之类的修饰符明显指出

2.rust可以通过方法的完全限定语法来确定要执行类型所实现的特质方法--如果这个名称的方法类型自己也有一个

3.在诸如java这样的语言中,是不允许rust这样的-对象的方法名和接口的方法名称一样

4.rust这种措施,允许重名出现,但这样反而会导致代码难于阅读。不清楚为什么它要容许这个,是不是因为rust设计到一半的时候,不想重构了,于是顺水推舟...

 

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部