Каким должен быть тип возврата для метода, который возвращает & str или новую строку с временем жизни родителя? - PullRequest
0 голосов
/ 02 января 2019

Я хочу создать метод id, который либо возвращает идентификатор, являющийся атрибутом struct, либо новую строку.

Каким должен быть мой тип возврата? &str для возврата атрибута структуры self.title, но каков же тип возврата новой строки с временем жизни вызывающей области?

fn id(&self) -> &str {
    match self.type {
        PageType::Type1 => format!("{}-{}", self.title, self.page_num),
        PageType::Type2 => &self.title,
    }
}

1 Ответ

0 голосов
/ 02 января 2019

Существует три способа реализации этого с различными компромиссами.

Вернуть собственную строку

Вы возвращаете 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 был максимально простым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...