Rust中解引用调用clone()与to_owned()的区别及代码疑问
Rust中to_owned()与解引用clone()的区别及引用clone的行为
核心代码差异分析
对于你给出的代码:
let my_reference_type : &SomeType; let a = my_reference_type.to_owned(); let b = (*my_reference_type).clone();
在绝大多数场景下,这两行代码的功能完全等价,都会生成SomeType的独立副本,最终a和b的类型都是SomeType,且是原对象的克隆版本。
原因在于Rust标准库中,ToOwned trait的默认实现就是针对引用类型&T,调用(*self).clone()来生成所有权类型的实例。所以如果SomeType没有自定义实现ToOwned,这两行代码的底层逻辑完全一致。
存在差异的特殊场景
只有当SomeType(或者它的父类型)自定义实现了ToOwned trait时,to_owned()的行为才会和clone()不同。比如标准库中的&str:
&str.to_owned()返回String(所有权类型)- 而
str作为动态大小类型无法直接调用clone(),实际中若对固定大小的自定义类型自定义ToOwned返回不同类型,就会出现明显差异。
直接对引用调用clone()的行为
你推测的结论是正确的:直接对&SomeType调用clone(),会触发Clone trait针对引用类型的实现,这个实现会返回一个新的引用(类型仍为&SomeType),且新引用和原引用指向同一个底层对象,并没有生成SomeType的副本。
举个简单验证例子:
let original = String::from("hello"); let ref1 = &original; let ref2 = ref1.clone(); // 验证两个引用指向同一对象 assert_eq!(ref1, ref2); assert!(std::ptr::eq(ref1, ref2)); // 地址相同,确认指向同一实例
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

