2.6.1.
物体安全 在定义特征时,它是否是对象安全也是未声明合同的一部分.
对象安全(英語:Object safety)是Rust中与特质对象相關的概念.
它决定一个特性是否可以动态地发出,即它是否可以以 .Trits that Are Object-Safe must satisfy the Fext Cates(基于 RFC 255)的形式使用.
所有超级海峡也必须是安全的 如果一个特征继承了其他特征,那么这些超级海峡也必须是物体安全.
它不能要求 A 特性不能作为超导使用,意味着它不能包含约束,因为在编译时一个特性对象的大小是未知的.
它不能有相关常数。
它不能有与类型参数相关联的类型.
所有相关功能(方法)必须符合以下规则之一: 可调度功能: 它们不能有任何类型的参数,尽管允许使用寿命参数.
它们必须是方法,可能只出现在接收器位置上,例如: 它们不能要求,否则特性只能用于已知大小的种类,并且会破坏物体安全。
明确不可分配的函数:它们可能返回,但这种函数必须要求,所以它们不能被调用在特质对象上,只能被混凝土类型所使用.
如果无法记住上述所有内容,只需记住物体安全性就可以描述一个特性能否被安全地转化为一个特性物体.
物件安全会做什么 如果一个特性是安全的,意思是它满足上述所有条件,那么我们可以用来将执行该特性的不同类型作为单一的通用类型处理.
如果它不安全,编译器将阻止您使用 。
对象安全和 API 设计 在设计API时,建议使特质对对象安全,即使这略会减少方便,因为它提供了使用特质并增加灵活性的新方法.
让我们举个例子:假设我们有两种方法的特点:和。
方法返回并代表了动物的名字.
该方法为动物打印出一出取自自外观的出自外观的出自外观而无所归.
我们有两个结构, 和, 两者都执行这个特征。
特性是安全的,因为它不返回或使用通用参数 因此,我们可以用它来创建一个特性对象: ,而这实际上变成了一个特性对象集合 输出:接下来,让我们对前一个例子做一个小的修改: 我们在特性上添加了一种新的方法,它返回一个值输出: 添加后,由于违反了返回类型不能是 的规则,所以不再具有对象安全性.
A通过指针调用,而指具体执行类型,其大小在编译时未知.
例如:如果我想在保留方法的同时保持物体安全,我该怎么办?
回到本条的第一节,看看明确不可分的函数:它们可能返回,但这种函数必须要求,所以它们不能被调用在特性对象上,只能被用到具体类型.
根据这一要求,我们可以这样修改代码: 输出: 这样,就没有错误。
注意, 现在只能调用混凝土类型; 否则会失败 : 输出: 因为特质法宣布了对返回值的要求, 而且没有已知的混凝土大小, 所以不能调用该方法 。
当然,它肯定在具体类型上起作用:通用拖拉机方法和API设计在拖拉机上设置通用参数,如果拖拉机必须有通用方法,请考虑将通用参数放在拖拉机本身上。
例:有一个特征叫做.,它有一个方法叫做.
实施这一计划肯定需要一个通用参数。
但是为了维护物体的安全,我们不能在方法本身中添加类型参数.
因此,我们把通用参数移到特征而不是特征方法,即: 通用参数在哪里?
这样,我们可以对不同的集装箱类型实施特性,以及