У меня есть черта, которая определяет интерфейс для объектов, которые могут содержать значение. Черты есть способ получения текущего значения:Как абстрагироваться от ссылки на значение или само значение?
pub trait HasValue<T> {
fn get_current_value(&self) -> &T;
}
Это прекрасно, но я понял, что в зависимости от фактической реализации, иногда это удобно возвращать ссылку, если T
хранится в поле, а иногда это удобно возвращать клон T
, если поле поддержки было разделено между потоками (например). Я изо всех сил пытаюсь понять, как представить это в черте. Я мог бы иметь что-то вроде этого:
pub enum BorrowedOrOwned<'a, T: 'a> {
Borrowed(&'a T),
Owned(T)
}
impl<'a, T: 'a> Deref for BorrowedOrOwned<'a, T> {
type Target = T;
fn deref(&self) -> &T {
use self::BorrowedOrOwned::*;
match self {
&Borrowed(b) => b,
&Owned(ref o) => o,
}
}
}
И изменить get_current_value()
вернуть BorrowedOrOwned<T>
, но я не уверен, что это идиоматическое. BorrowedOrOwned<T>
напоминает мне Cow<T>
, но так как точка Cow
составляет copy-on-write, и я буду отбрасывать любые записи, которые кажутся семантически неправильными.
Действительно ли Cow<T>
правильный способ аннотация над ссылкой или стоимостью? Есть ли лучший способ, чем BorrowedOrOwned<T>
?
Вернул бы связанный тип 'B: Borrow' работа? –
@ChrisEmerson Я не уверен, какие компромиссы в этом будут, поэтому я не уверен. Не могли бы вы немного рассказать об этом? Это похоже на вопрос, который может быть в целом полезен, поэтому меня интересуют все ответы, даже если они не затрагивают мою конкретную ситуацию. –
Я думаю, что на самом деле это не помогает напрямую; вы все еще нуждаетесь в чем-то вроде «Корова». –