Это может зависеть от регистра, но когда это возможно, вы должны предпочесть принять значение напрямую (как, например, T: Trait
).
Существует аналогичное руководство по API ( C-RW-VALUE ), которое рекомендует интерфейсам принимать параметр T
напрямую, а не изменяемую ссылку на значение, которое реализует std::io::Read
или std::io::Write
. Это работает, потому что Read
и Write
также реализованы для изменяемых ссылок на произвольные T
типы, реализующие эти черты.
Если вы контролируете эту черту, использование того же подхода довольно идиоматично и решает вашу проблему без необходимости использования большого количества функций конструктора.
trait T { }
// generic implementations for references and smart container types follow
impl<'a, U: ?Sized + T> T for &'a U { }
impl<U: ?Sized + T> T for Box<U> { }
struct A { }
impl T for A { }
fn main() {
let a = A {};
let s1 = S::new(a);
let s2 = S::new(&a);
let s3 = S::new(&a as &T);
let s4 = S::new(Box::new(a));
}
Смотри также: