Rust 为什么';操作:范围<;T>;实现复制,即使T是复制?
最近,我想为3D投影编写一个包含参数的类型:Rust 为什么';操作:范围<;T>;实现复制,即使T是复制?,rust,Rust,最近,我想为3D投影编写一个包含参数的类型: use std::ops::Range; #[derive(Clone, Copy)] struct CamProj { /// Near and far plane proj_range: Range<f32>, /// Field of view fov: cgmath::Rad<f32>, // `Rad` derives `Copy` /// Width divided
use std::ops::Range;
#[derive(Clone, Copy)]
struct CamProj {
/// Near and far plane
proj_range: Range<f32>,
/// Field of view
fov: cgmath::Rad<f32>, // `Rad` derives `Copy`
/// Width divided by height
aspect_ratio: f32,
}
使用std::ops::Range;
#[派生(克隆、复制)]
坎普洛伊结构酒店{
///近远平面
项目范围:范围,
///视野
fov:cgmath::Rad,//`Rad`派生`Copy`
///宽度除以高度
纵横比:f32,
}
然而,我得到了这个错误:
error[E0204]:此类型可能无法实现特征'Copy'
--> :3:21
|
3 |#[衍生(克隆、复制)]
| ^^^^
...
6 |项目范围:范围,
|-------------------------此字段不实现“复制”`
显然,Range
从未实现Copy
,即使T
是Copy
,就像f32
是这是为什么?我以为范围
就是一对T
s?因此它肯定可以实现Copy
?,因为范围
经常用作迭代器,迭代器是Copy
。这与认为迭代器是高级的有关,而实际上迭代器是高级的副本:
for x in it { // a *copy* of the iterator is used here
// ..
}
match it.next() { // the original iterator is used here
// ..
}
:
另一个引发了一个问题:
人们认为,通过clone
显式复制迭代器有助于防止这些情况
特别是将
复制
重新添加到范围
。提出了一种可能的解决办法:
范围字段是公共的,您可以在构造函数/函数边界处将其重新打包为可复制元组(或等效元组)
另见:
fn main() {
let stream = "Hello, world!".chars().cycle();
for _ in 0..10 {
let chunk: String = stream.take(3).collect();
println!("{}", chunk);
}
}