характеристики в векторе
От: sergii.p  
Дата: 07.07.23 06:30
Оценка:
задача: есть некие индикаторы, которые можно рассчитать. Но каждый индикатор может вернуть также разнородные данные. От этих данных требуется, чтобы они поддерживали только std::fmt::Display. Например, имя человека и его термпература (разные методы расчёта, разные возвращаемые типы).
Надо это всё засунуть в вектор.

trait Indicator {
    type Type: std::fmt::Display; // возвращаемый тип
    fn calc(&self) -> Box<Self::Type>; // функция для расчёта. Хотелось бы возвращать не Box, но вроде это невозможно
}


Текущая проблема — не компилируется. Не понимаю как описать тип вектора.
https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=431cf11e95deba8ebd60740b1764d791
Re: характеристики в векторе
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 07.07.23 08:06
Оценка: 4 (1) +1
Здравствуйте, sergii.p, Вы писали:

SP>задача: есть некие индикаторы, которые можно рассчитать. Но каждый индикатор может вернуть также разнородные данные. От этих данных требуется, чтобы они поддерживали только std::fmt::Display. Например, имя человека и его термпература (разные методы расчёта, разные возвращаемые типы).

SP>Надо это всё засунуть в вектор.

SP>
SP>trait Indicator {
SP>    type Type: std::fmt::Display; // возвращаемый тип
SP>    fn calc(&self) -> Box<Self::Type>; // функция для расчёта. Хотелось бы возвращать не Box, но вроде это невозможно
SP>}
SP>


SP>Текущая проблема — не компилируется. Не понимаю как описать тип вектора.

SP>https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=431cf11e95deba8ebd60740b1764d791

dyn в расте не обладает вариантностью. То есть если T1: T2, то dyn T1 никак не связан с dyn T2

Поэтому надо от типа внутри трейта избавится и возвращать из calc просто Box<dyn Display>
Re: характеристики в векторе
От: ArtDenis Россия  
Дата: 07.07.23 08:13
Оценка: 4 (1)
Здравствуйте, sergii.p, Вы писали:

SP>
SP>trait Indicator {
SP>    type Type: std::fmt::Display; // возвращаемый тип
SP>    fn calc(&self) -> Box<Self::Type>; // функция для расчёта. Хотелось бы возвращать не Box, но вроде это невозможно
SP>}
SP>


type Type совершенно лишний
https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=c39d6d093c5ff3a1938f8ab877b92ab1
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: характеристики в векторе
От: ArtDenis Россия  
Дата: 07.07.23 08:15
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Поэтому надо от типа внутри трейта избавится и возвращать из calc просто Box<dyn Display>


А если значения хранятся в объектах, то можно возвращать вообще &dyn Display, но придётся добавить лайфтаймы
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.