Я немного теряюсь в семантике компилятора Rust, но пытаюсь найти самый дешевый способ просто обратиться к массиву кортежей чисел по некоторому имени для каждого поля и передать его между функциями. Точнее, я получаю из внешнего источника список формы [(f64, f64, f64)]
, каждая из которых имеет имя. Я хочу иметь возможность ссылаться на поля по имени, но без преобразования их в какой-либо дополнительный тип (если только это не требует нулевой стоимости).
например Я мог бы пробежаться и обернуть их в:
struct NameStruct {
foo: f64,
bar: f64,
baz: f64,
}
однако я предполагаю, что для этого потребуется пробежаться по массиву и обернуть его? В то время как псевдоним типа выглядит так, как будто в нем нельзя называть отдельные поля.
Я уверен, что мне не хватает чего-то простого!
Вопросы сформулированы не одинаково. Но это, по сути, то, о чем вы спрашиваете
@vallentin: Учитывая, что здесь задействован массив, я не думаю, что это отвечает на вопрос.
IndexMut
, не прибегая к тем же методам, что и для исходной задачи). , и вместо этого потребуются геттеры/сеттеры).
Является ли этот «внешний источник» библиотекой Rust (то есть у вас есть какая-то функция, которая возвращает [(f64, f64, f64)]
, или это какой-то формат сериализации?
@Ry- Это работает для массива или среза, но не для кортежа, потому что кортежи #[repr(Rust)]
, что означает, что их расположение в памяти не указано.
У вас могут быть методы для «именования» полей. Определение методов для всех кортежей, вероятно, неправильно, но вы можете создать структуру-оболочку #[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)
}
Отвечает ли это на ваш вопрос? Как Rust реализует абстракцию с нулевой стоимостью для шаблона NewTypes