rust - 为什么是 Rust 的盒子克隆实现需要 T 是克隆?
问题描述
我正在为泛型编写一个库,Box<T>
并且在我需要克隆的代码的一部分上Box<T>
,所以我做了这样的事情:
impl<T> OnTheFlySwap<T>
where
T: ?Sized + Send + Sync, Box<T>: Clone
{
我补充Box<T>: Clone
说,这没什么大不了的,因为只有明确禁止的对象Box<T>: Clone
才会有问题。但是不,显然如果对象没有明确实现Box<T>: Clone
,那么我就有问题了,因为这是官方的impl Clone for Box
:
impl<T, A> Clone for Box<T, A> where
T: Clone,
A: Allocator + Clone,
它需要T
是Clone.
为什么?不是每个都Box<T>
可以Clone
,因为克隆 aBox
不需要时间?如果一个对象不希望它的盒子被克隆,那么它可以!Clone
为它实现,但默认应该是impl Clone for Box<T>
any T
。
解决方案
Box<T>
Rust 中的A代表一个拥有a的盒子T
。如果您可以克隆 aBox
并获得第二个指向相同的框T
,那么哪个将拥有该T
值?Box
不仅仅是 Rust 的 C++ 指针版本;它代表了一种所有权概念,像 C++ 这样的语言不强制执行。
作为练习,考虑尝试编写您为Box::clone
自己建议的函数。它的签名是
fn my_clone<T>(value: &Box<T>) -> Box<T> { ... }
尝试使用该签名编写一个函数,而无需深入研究unsafe
. 编译器会很快让你知道出了什么问题。
克隆盒子的唯一安全方法是克隆盒子内的所有东西,这需要T : Clone
.
推荐阅读
- javascript - Webpack Dev Server Live 仅重新加载一次 - 不接受更改
- amazon-web-services - 如何使用 Transform AWS::CodeDeployBlueGreen 为 CloudFormation 模板创建更改集
- php - 在 Laravel 的一家工厂中计算一张桌子的数量
- c# - 如何自定义 SOLine InventoryID 选择器?
- javascript - Javascript切换不适用于元素的孩子和孩子的兄弟姐妹
- javascript - 合并两个对象而不覆盖相同的属性
- javascript - 如何计算 div 标签内的文本行数
- python - 如何检查某人是否有管理员权限 on_message discord.py
- mysql - 哪个 AWS 服务用于我的大型 MySQL 表?
- sql - 如何使用正则表达式作为 CSV 分隔符创建将 CSV 值转换为表格的函数?