Как наложить срез на ссылку массива в ржавчине [дубликат]

Почему вы не используете следующую опцию dir?

ftp.dir('-t',data.append)

С помощью этой опции список файлов упорядочен по времени от самого нового до самого старого. Затем просто загрузите первый файл в список, чтобы загрузить его.

21
задан Shepmaster 7 June 2016 в 12:35
поделиться

3 ответа

Вы можете вручную создать массив и вернуть его.

Вот функция, которая может легко масштабироваться, если вы хотите получить больше (или меньше) трех элементов.

Примечание. что если срез слишком мал, конечные члены массива будут равны 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
}
8
ответ дан Levans 20 August 2018 в 20:43
поделиться

Я рекомендую использовать 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()
}
10
ответ дан paholg 20 August 2018 в 20:43
поделиться

Благодаря @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!, если целевой массив и пропущенные ломтики не имеют одинаковой длины.

14
ответ дан Shepmaster 20 August 2018 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: