Требуется признак для реализации дистрибутива для стандартного дистрибутива

#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 .