Как интерпретировать массив f64 как кортеж из элементов f64? - PullRequest
0 голосов
/ 07 марта 2020

У меня есть генератор кода, который производит вызов функции, которая возвращает Vec<f64>. Мне нужно назначить эти значения в набор переменных, и наилучшим способом является набор этих переменных. Примерно так:

let array: &[f64] = &my_function(3);
let (a, b, c): (f64, f64, f64) = unsafe { std::mem::transmute(*array) };

детская площадка (без компиляции)

Я не понял, как написать небезопасную часть, чтобы она была принята компилятором.

Я предпочитаю избегать создания предмета для каждого предмета, потому что здесь очень важна производительность.

Можно ли это сделать? Совместима ли структура памяти кортежа с массивом?

1 Ответ

5 голосов
/ 08 марта 2020

Вы не можете сделать это, точка; кортежи не имеют гарантированного макета памяти , поэтому вы не можете преобразовать из чего-то, что может или не может соответствовать.

Я бы сделал нормальное сопоставление с образцом:

fn main() {
    let values = my_function(3);
    dbg!(&values);
    let (a, b, c) = match &*values {
        [a, b, c] => (a, b, c),
        _ => panic!(),
    };
    dbg!(a, b, c);
}

fn my_function(count: usize) -> Vec<f64> {
    vec![3.14_0f64; count]
}

См. Также:

...