Вы можете объединить clone
и into
для поддержки ссылок и простых преобразований вместе.
macro_rules! impl_foo {
( $t0:ty as $t:ty ) => {
impl Foo for $t0 {
fn foo(self) {
let _: $t = self.clone().into();
}
}
}
}
Clone::clone
будет запретом для значения и покажет базовый тип, еслиэто ссылка.Результат clone()
является однозначным, поэтому тип ввода into()
также будет однозначно выведен.
Для простых типов Copy
следует ожидать, что clone
будет реализован как memcpy
в большинстве случаев, так что это не должно быть проблемой производительности.