Po pierwsze, początkowa definicja sekwencji jest błędna. Mówisz, że chcesz 1, 2, 3, 8, 9, 10
jako wyjście, tak to powinno wyglądać:
let v = (1u64 .. 11).collect::<Vec<_>>();
Następnie mówisz chcesz złączyć plasterki, więc niech faktycznie używać plastrów:
let head = &v[..3];
let tail = &v[l-3..];
Na to punkt, to naprawdę zależy od tego, które podejście lubisz najbardziej. Można włączyć te plastry do iteratorów, łańcuch, następnie zebrać ...
let v2: Vec<_> = head.iter().chain(tail.iter()).collect();
... albo zrobić vec i przedłużyć go bezpośrednio plasterki ...
let mut v3 = vec![];
v3.extend_from_slice(head);
v3.extend_from_slice(tail);
... lub rozszerzyć przy użyciu bardziej ogólnych iteratory (co stanie się w przyszłości równoważne ze specjalizacji, ale nie wierzę, że jest tak skuteczny tylko jeszcze) ...
let mut v4: Vec<u64> = vec![];
v4.extend(head);
v4.extend(tail);
... albo cou Używaj Vec::with_capacity
i w pętli lub wykonaj połączenie z iteratorem, ale używając extend
... ale muszę się zatrzymać pod adresem o numerze.
Pełna przykładowy kod:
fn main() {
let v = (1u64 .. 11).collect::<Vec<_>>();
let l = v.len();
let head = &v[..3];
let tail = &v[l-3..];
println!("head: {:?}", head);
println!("tail: {:?}", tail);
let v2: Vec<_> = head.iter().chain(tail.iter()).collect();
println!("v2: {:?}", v2);
let mut v3 = vec![];
v3.extend_from_slice(head);
v3.extend_from_slice(tail);
println!("v3: {:?}", v3);
// Explicit type to help inference.
let mut v4: Vec<u64> = vec![];
v4.extend(head);
v4.extend(tail);
println!("v4: {:?}", v4);
}
Dzięki. Czy "<_>" oznacza coś w stylu "proszę podać typ"? –
Nie musisz zbierać 'Pomiń', ponieważ' extend' może przyjmować iterator – Neikos
@TheUnfunCat Tak, '_' jest typem zastępczym – Neikos