Существует три способа реализации этого с различными компромиссами.
Вернуть собственную строку
Вы возвращаете String
и используете self.title.clone()
.
- Плюсы: просто.
- Минусы: выделяет новую строку при каждом вызове, даже в простом случае.
Используйте, если у вас нет оснований думать, что это может стать проблемой производительности, и вам нужна простота простого возврата String
.
Сохранить идентификатор в структуре
Постройте его в функции конструктора. (Построение по требованию также возможно, но связано со сложными проблемами при жизни.) Возврат &str
. Вряд ли есть веская причина использовать &String
.
- Плюсы: очень дешевый звонок.
- Минусы: нужно хранить идентификатор. Необходимо обновлять его при изменении полей
title
или page_num
.
Использовать при доступе очень часто.
Возврат Cow
Этот тип способен представлять либо заемную, либо принадлежащую вещь, и с помощью непосредственного принуждения действует как заемная вещь в использовании.
fn id(&self) -> Cow<str> {
match self.ty {
PageType::Type1 => Cow::Owned(format!("{}-{}", self.title, self.page_num)),
PageType::Type2 => Cow::Borrowed(&self.title),
}
}
- Плюсы: эффективный в простом случае. Не увеличивает размер структуры. Не требует сложного кода для поддержки идентификатора.
- Минусы: использование немного сложнее, в зависимости от того, что пользователь делает с результатом. По-прежнему выделяет новую строку в сложном случае.
Это хороший вариант использования по умолчанию, если только вы не хотите, чтобы API был максимально простым.