#rust #traits #type-parameter
#Ржавчина #Трейты #тип-параметр
Вопрос:
Я пытаюсь создать признак, который требует от разработчиков внедрения дистрибутива для стандартного дистрибутива rand
ящика.
Недавно я узнал, как сделать это средством реализации признака, чтобы также реализовать признак отображения с помощью SuperTraits, и я хотел бы сделать аналогичную вещь для привязки признака Standard: Distribution<Self>
. Я могу добавить этот признак, связанный с предложением where как таковым:
use rand::{Rng, distributions::{Distribution, Standard}}; // rand 0.7
use std::fmt;
trait SampleAndDisplay: fmt::Display Sized
where
Standard: Distribution<Self>
{
fn other_requirement() -> u16;
}
// For any type to implement SampleAndDisplay, they need the following at least:
struct Implementor;
impl SampleAndDisplay for Implementor {
fn other_requirement() -> u16 {
// ...
}
}
impl fmt::Display for Implementor {
fn fmt(amp;self, f: amp;mut fmt::Formatter<'_>) -> fmt::Result {
// ...
}
}
impl Distribution<Implementor> for Standard {
fn sample<R: Rng ?Sized>(amp;self, rng: amp;mut R) -> Implementor {
// ...
}
}
Но проблема, с которой я сталкиваюсь, заключается в том, что теперь мне нужно добавлять дополнительную привязку к признаку всякий раз, когда я использую SampleAndDisplay
:
fn func<T>()
where
T: SampleAndDisplay,
Standard: Distribution<T>, // Would like to not have to always put this
{
// ...
}
В некотором смысле, я думаю, что хотел бы сделать следующее, но я не могу понять правильный синтаксис, или это вообще возможно:
trait SampleAndDisplay: (Standard: Distribution<Self>) fmt::Display Sized
{
fn other_requirement() -> u16;
}
Любая помощь приветствуется.
Комментарии:
1. Похоже, это связано с проблемой #20671 .