You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:07:08