Rust 方法语法

作者: kaiv2 | 来源:发表于2020-03-22 09:07 被阅读0次

    方法语法

    方法 与函数类似:它们使用fn关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码。不过方法与函数是不同的,因为它们在结构体的上下文中被定义(或者是枚举或trait对象的上下文),并且他们地一个参数总是self,它代表调用该方法的结构体实例。

    定义方法

    #[derive(Debug)]
    struct Rectangle {
        width: u32,
        height: u32,
    }
    impl Rectangle {
        fn area(&self) -> u32 {
            self.width * self.height
        }
    }
    
    fn main() {
        let rect1 Rectangle{ width: 30, height: 50};
        println!("{}", rect1.area());
    }
    

    为了使函数定义于Rectangle的上下文中,我们开始了一个impl块。接着将area函数移动到impl大括号中,并将签名中的第一个参数修改为self

    带有更多参数的方法

    fn main() {
        let rec1 = Rectangle { width: 30, height: 50 };
        let rec2 = Rectangle { width: 10, height: 40 };
        let rec3 = Rectangle { width: 60, height: 45 };
        
        println!("{}", rec1.can_hold(&rec2));
        println!("{}", rec1.can_hold(&rec3));
    }
    
    impl Rectangle {
        fn can_hold(&self, other: &Rectangle) -> bool {
            self.width > other.width && self.height > other.height
        }
    }
    

    关联函数

    impl块的另一个有用的功能是:允许impl块中定义不以self做为参数的函数。这被称为关联函数,因为它们与结构体关联。他们仍是函数而不是方法,因为它们并不作用于一个结构体的实例。你已经使用了String::from关联函数了。

    impl Rectangle {
        fn square(size: u32) -> Rectangle {
            Rectangle { width: size, height: size }
        }
    }
    

    使用结构体名和::语法来调用这个关联函数:比如let sq = Rectangle::square(3);

    多个impl

    每个结构体都允许拥有多个impl块。

    impl Rectangle {
        fn area(&self) -> u32 {
            self.width * self.height
        }
    }
    
    impl Rectangle {
        fn can_hold(&self, other: &Rectangle) -> bool {
            self.width > other.width && self.height > other.height
        }
    }
    

    总结

    结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。方法允许为结构体实例指定行为,而关联函数将特定功能置于结构体的命名空间中并且无需一个实例。

    相关文章

      网友评论

        本文标题:Rust 方法语法

        本文链接:https://www.haomeiwen.com/subject/wdqpyhtx.html