Почему вы не используете следующую опцию dir?
ftp.dir('-t',data.append)
С помощью этой опции список файлов упорядочен по времени от самого нового до самого старого. Затем просто загрузите первый файл в список, чтобы загрузить его.
Вы можете вручную создать массив и вернуть его.
Вот функция, которая может легко масштабироваться, если вы хотите получить больше (или меньше) трех элементов.
Примечание. что если срез слишком мал, конечные члены массива будут равны 0.
fn pop(barry: &[u8]) -> [u8; 3] {
let mut array = [0u8; 3];
for (&x, p) in barry.iter().zip(array.iter_mut()) {
*p = x;
}
array
}
Я рекомендую использовать crate arrayref , который имеет удобный макрос для выполнения только этого.
Обратите внимание, что, используя этот ящик, вы создаете ссылку на массив, &[u8; 3]
, потому что он не клонирует какие-либо данные!
Если вы do хотите клонировать данные, вы все равно можете использовать макрос, а call clone в конце:
#[macro_use]
extern crate arrayref;
fn pop(barry: &[u8]) -> &[u8; 3] {
array_ref!(barry, 0, 3)
}
или
#[macro_use]
extern crate arrayref;
fn pop(barry: &[u8]) -> [u8; 3] {
array_ref!(barry, 0, 3).clone()
}
Благодаря @malbarbo мы можем использовать эту вспомогательную функцию:
use std::convert::AsMut;
fn clone_into_array<A, T>(slice: &[T]) -> A
where
A: Default + AsMut<[T]>,
T: Clone,
{
let mut a = Default::default();
<A as AsMut<[T]>>::as_mut(&mut a).clone_from_slice(slice);
a
}
, чтобы получить более синтаксис:
fn main() {
let original = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let e = Example {
a: clone_into_array(&original[0..4]),
b: clone_into_array(&original[4..10]),
};
println!("{:?}", e);
}
как T: Default + Clone
.
Если вы знаете, что ваш тип реализует Copy
, вы можете использовать эту форму:
use std::convert::AsMut;
fn copy_into_array<A, T>(slice: &[T]) -> A
where
A: Default + AsMut<[T]>,
T: Copy,
{
let mut a = Default::default();
<A as AsMut<[T]>>::as_mut(&mut a).copy_from_slice(slice);
a
}
Оба варианта будут panic!
, если целевой массив и пропущенные ломтики не имеют одинаковой длины.