Каков способ «наименования» списка кортежей в Rust с наименьшими затратами времени выполнения?

Я немного теряюсь в семантике компилятора Rust, но пытаюсь найти самый дешевый способ просто обратиться к массиву кортежей чисел по некоторому имени для каждого поля и передать его между функциями. Точнее, я получаю из внешнего источника список формы [(f64, f64, f64)], каждая из которых имеет имя. Я хочу иметь возможность ссылаться на поля по имени, но без преобразования их в какой-либо дополнительный тип (если только это не требует нулевой стоимости).

например Я мог бы пробежаться и обернуть их в:

struct NameStruct {
   foo: f64,
   bar: f64,
   baz: f64,
}

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

Я уверен, что мне не хватает чего-то простого!

Отвечает ли это на ваш вопрос? Как Rust реализует абстракцию с нулевой стоимостью для шаблона NewTypes

vallentin 24.04.2024 00:57

Вопросы сформулированы не одинаково. Но это, по сути, то, о чем вы спрашиваете

vallentin 24.04.2024 00:57

@vallentin: Учитывая, что здесь задействован массив, я не думаю, что это отвечает на вопрос.

Ry- 24.04.2024 00:58
stackoverflow.com/a/76222982/707111? Вы также можете реализовать тип представления, обертывающий срез, который, вероятно, будет оптимизирован, хотя это немного многословно и менее гибко (например, вы не сможете реализовать IndexMut, не прибегая к тем же методам, что и для исходной задачи). , и вместо этого потребуются геттеры/сеттеры).
Ry- 24.04.2024 01:01

Является ли этот «внешний источник» библиотекой Rust (то есть у вас есть какая-то функция, которая возвращает [(f64, f64, f64)], или это какой-то формат сериализации?

Cerberus 24.04.2024 06:25

@Ry- Это работает для массива или среза, но не для кортежа, потому что кортежи #[repr(Rust)], что означает, что их расположение в памяти не указано.

cafce25 24.04.2024 06:37
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
2
6
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас могут быть методы для «именования» полей. Определение методов для всех кортежей, вероятно, неправильно, но вы можете создать структуру-оболочку #[repr(transparent)], которую можно преобразовать без затрат. Вы можете сделать это с нулевым небезопасным кодом, как я объяснил здесь , через bytemuck:

#[derive(bytemuck::TransparentWrapper)]
#[repr(transparent)]
struct NameStruct((f64, f64, f64));

impl NameStruct {
    fn foo(&self) -> f64 { self.0.0 }
    fn bar(&self) -> f64 { self.0.1 }
    fn baz(&self) -> f64 { self.0.2 }
}

fn convert(arr: &[(f64, f64, f64)]) -> &[NameStruct] {
    bytemuck::TransparentWrapper::wrap_slice(arr)
}

Другие вопросы по теме