Как реализовать трейт для любой изменчивости?

Может ли изменчивость быть универсальным параметром в чертах? Я хотел бы реализовать черту для изменяемого и неизменяемого варианта типа без необходимости копировать и вставлять блок impl.

trait Foo<T> {…}

impl<T> Foo for *const T {…}
impl<T> Foo for *mut T {…same thing again…}

Желаемый псевдокод:

trait Foo<T> {…}

impl<T, Mutability> Foo for *Mutability T {…}

person Kornel    schedule 07.02.2015    source источник
comment
В качестве обходного пути вы можете определить частный макрос для генерации обоих impls, или вы можете перенаправить реализацию одного варианта другому с помощью приведений: реализовать для *const T, затем определить impl для *mut T как (self as *const T).method() или что-то в этом роде.   -  person    schedule 08.02.2015
comment
Кастинг - это, вероятно, решение, которое я видел больше всего в этом случае; Думаю, я даже видел, как люди сохраняли * const T указатели и приводили их к *mut T только тогда, когда это явно было необходимо. В более общем плане люди хотят иметь возможность возвращать параметризованные по изменяемости, а также изменять изменяемость ссылок &T ‹-› &mut T. В таких случаях я бы очень осторожно подошел к кастингу или трансмутации.   -  person Shepmaster    schedule 08.02.2015


Ответы (1)


Может ли изменчивость быть универсальным параметром в чертах?

No. ^_^

Вот подробное обсуждение этого вопроса (Internals, Reddit).

Я думаю, что в целом люди признают, что текущее состояние не является идеальным, но и в настоящий момент оно не сильно ограничивает. Есть опасения относительно того, как именно это будет реализовано, и правильности различных подходов. Некоторые люди задаются вопросом, решат ли проблемы высшие типы (HKT), если и когда они будут добавлены в Rust.

Смотрите также:

person Shepmaster    schedule 07.02.2015