Вы говорите, что собираетесь проиндексировать свой фрагмент с usize
:
U: std::ops::Index<usize>,
Затем вы индексируете срез чем-то, что не usize
:
f(&s[..]);
Это RangeFull
. Правильно, компилятор не позволяет вам лгать о типах.
Вместо этого, если вы используете правильные типы, как показано в сообщении об ошибке, это работает:
U: std::ops::Index<std::ops::RangeFull>,
Тогда ошибка касается типа вывода индексации. См. Требование реализации Mul в универсальной функции для полного описания.
U: std::ops::Index<std::ops::RangeFull, Output = [f64]>,
Как говорится ...
- Нет причин вводить универсальный тип
U
. Вместо этого добавьте границы признаков для связанного типа D
.
- Маловероятно, что вы хотите форсировать динамическую отправку вашего закрытия. Вместо этого возьмите его как универсальный тип:
use std::ops::{Index, RangeFull};
pub fn foo<D, F>(dist: &D, f: F)
where
D: Distribution,
D::T: Index<RangeFull, Output = [f64]>,
F: Fn(&[f64]),
{
let s = dist.sample();
f(&s[..]);
}
или эквивалентно:
pub fn foo<D>(dist: &D, f: impl Fn(&[f64]))
where
D: Distribution,
D::T: std::ops::Index<std::ops::RangeFull, Output = [f64]>,
Однако, использование RangeFull
для этого общего уровня не подходит мне. Я бы использовал AsRef
вместо:
pub fn foo<D>(dist: &D, f: impl Fn(&[f64]))
where
D: Distribution,
D::T: AsRef<[f64]>,
{
let s = dist.sample();
f(s.as_ref());
}