Rust 为什么';操作:范围<;T>;实现复制,即使T是复制?

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

最近,我想为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 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);
    }
}