企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
rust有3种结构体类型,具名结构体,类元组结构体和空结构体。 在内存中具名结构体和类元组结构体都是一样的,为不同类型值的集合,在内存中以特殊的结构展示。不像c和c++,rust没有明确的承诺结构体要以什么顺序排列它的成员。但是它承诺了直接在结构体的内存块中存储成员。而js,python,java都是存储值到自己的堆空间中,并用结构体的成员名称指向它们。rust是直接存储到结构体的内存里,附加的buffer保留在堆空间,比如字符串成员和向量成员的实体仍然在堆空间。你可以要求rust按照c和c++兼容的方式来存储成员,需要用到#\[repr(C)\]属性。 你可以给任意结构体类型定义方法,和C++和java不同,方法不是定义在结构体的块里面,而是在单独的impl块里定义。一个impl块是简单的fn定义集合,每个都成为结构体的方法。方法也称为关联函数,因为它们和结构体类型关联在了一起。和关联函数相对的是自由函数,自由函数没有定义在impl块里。方法的第一个参数是self或者self引用,rust允许你省略self的类型参数,写作self、&self或者&mut self。你也可以像常规参数那样写完整,但是大多数代码都用简写。 不像C++和java,方法里有个this对象可以用,rust必须显式地使用self来指明调用方法的对象。当self是引用的时候,调用方法的对象不必显式地转换成引用再调用,rust会隐式地自动生成引用再调用。假如一个方法不需要修改self,可以把self定义成共享引用;假如方法需要获得self的所有权,就不能把self定义成引用,但是要注意,这样调用方法的对象会变成未初始化状态,由于获得了所有权,还可以把成员里的非拷贝类型子成员移出结构体消费掉。 你也可以定义没有self参数的方法,这种函数和结构体的类型关联而不是值关联。参照C++和java的传统,rust称这种方法为静态方法,它们经常用来用作构造函数,静态方法用类型名加::来调用。 rust里构造函数按习惯都命名为new,比如Vec::new、Box::new、HashMap::new。但是他们仅仅是一个名字叫new的静态方法而已,new并不是一个关键字。也有其他名字的静态方法充当构造函数的,比如Vec::with\_capacity。 尽管你可以给一个类型定义多个impl块,但是它们必须在定义类型的同一个包中。然而rust允许你给其它类型附加自己的方法。把类型的方法和类型成员的定义分开看起来奇怪,但是它有它的好处。 你可以很容易地找到结构体的所有数据成员,在C++的类定义里,你可能要翻看几百行的方法定义才能找完全它的数据成员,在rust中,它们都在一起的一目了然。 对于类元组结构体和空结构体,要把方法放到结构体定义里面比较困难,把方法抽出来放到单独的impl块里对3种结构体都适用。实际上这种语法可以对任意类型定义方法,包括枚举类型个原始类型比如i32。 相同的impl语法还可以用于实现特征trait。