「ベクターの倍増」は実際には非常に頻繁に行われるものではないため、そのためのショートカットはありません。さらに、Vec
の内部の内容は、その操作がどのような操作を実行できるかを変更するため重要です。この具体例では、次のコードは動作します
let x = vec![1, 2, 3];
let y: Vec<_> = x.iter().cycle().take(x.len() * 2).collect();
println!("{:?}", y); //[1, 2, 3, 1, 2, 3]
cycle()
方法は、アイテムが重複することができるようにIterator
の項目がClone
形質を実装することを必要とします。したがって、Vec
の項目にClone
が実装されている場合、これは機能します。不変参照(&
)はClone
を実装しているため、Vec<&Something>
は動作しますが、可変参照(&mut
)はClone
を実装していないため、Vec<&mut Something>
は機能しません。タイプがClone
を実装していない場合でも、あなたはまだ、その型への参照を複製することができ
注:ウェズリーの答えに
struct Test;
fn test_if_clone<T: Clone>(_x: T) {}
fn main() {
let x = Test;
test_if_clone(x); //error[E0277]: the trait bound `Test: std::clone::Clone` is not satisfied
let y = &x;
test_if_clone(y); //ok
}
このソリューションでも、それらの '.clone()'のうちの1つだけが必要です。 – trentcl