Я пишу некоторый код Rust, который включает обобщенные c признаки и не 'static
типы, и в результате я столкнулся с необходимостью приблизить generi c связанные типы . Я понимаю, что GAT нельзя элегантно эмулировать в текущем Rust, но я подумал, что нашел (неэлегантный) обходной путь, который бы сработал для моей конкретной ситуации c, используя характеристики с параметрами времени жизни и границы признаков более высокого ранга. Тем не менее, я получаю ошибки компилятора, которые я не понимаю, относительно реализации отсутствующих признаков для связанных типов.
Следующий код показывает минимальный пример, который воспроизводит ошибку.
use std::fmt::Debug;
trait Resource<'r> {
type Value;
}
struct ResourceImpl();
impl<'r> Resource<'r> for ResourceImpl {
type Value = u32;
}
fn test_generic<R>()
where
for<'r> R: Resource<'r>,
for<'r> <R as Resource<'r>>::Value: Debug,
{
}
fn test_specific() {
test_generic::<ResourceImpl>();
}
Когда Я пытаюсь скомпилировать этот код (rustc
1.41.0), я получаю следующее сообщение об ошибке:
error[E0277]: `<ResourceImpl as Resource<'r>>::Value` doesn't implement `std::fmt::Debug`
--> src/lib.rs:21:5
|
13 | fn test_generic<R>()
| ------------
...
16 | for<'r> <R as Resource<'r>>::Value: Debug,
| ----- required by this bound in `test_generic`
...
21 | test_generic::<ResourceImpl>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `<ResourceImpl as Resource<'r>>::Value` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
|
= help: the trait `for<'r> std::fmt::Debug` is not implemented for `<ResourceImpl as Resource<'r>>::Value`
Сообщение об ошибке звучит так, как будто говорится, что u32
не реализует Debug
, что не имеет смысла. Должно быть, я неправильно понимаю, что означает сообщение об ошибке, но я не могу понять, в чем проблема.