По умолчанию security security использует сопоставление стиля муравьев, которое не может соответствовать параметрам. Однако сопоставление в регксе может соответствовать параметрам
Попробуйте определить его так:
Не знаю, почему Roo не делает этого автоматически. Похоже, это должно быть.
, а затем
blockquote>sum()
знает, что возвращаетi32
Это ключевая недостающая точка. Хотя тип «ввода» уже известен (он должен быть чем-то, что реализует
Iterator
, чтобыsum
был даже доступен), тип «output» очень гибкий.Check out
Iterator::sum
:fn sum<S>(self) -> S where S: Sum<Self::Item>,
Он возвращает общий тип
S
, который должен реализоватьSum
.S
не должен соответствоватьSelf::Item
. Поэтому компилятор требует указать, какой тип суммировать.Почему это полезно? Проверьте эти два примера реализации из стандартной библиотеки:
impl Sum<i8> for i8 impl<'a> Sum<&'a i8> for i8
Правильно! Вы можете суммировать итератор
u8
или итератор&u8
! Если бы у нас этого не было, тогда этот код не сработал бы:fn main() { let a: i32 = (0..5).sum(); let b: i32 = [0, 1, 2, 3, 4].iter().sum(); assert_eq!(a, b); }
Поскольку bluss указывает , мы могли бы выполнить это, имея ассоциированный тип , которые связывают
u8 -> u8
и&'a u8 -> u8
.Если бы у нас был только связанный тип, тогда целевой тип суммы всегда был бы исправлен, и мы потеряли бы гибкость. См. . Если для более подробной информации можно использовать связанный тип по сравнению с общим типом? .
В качестве примера мы также можем реализовать
Sum<u8>
для наших собственных типов. Здесь мы суммируемu8
s, но увеличиваем размер суммируемого типа, так как, вероятно, сумма превыситu8
. Эта реализация находится в дополнении к существующим реализациям из стандартной библиотеки:#[derive(Debug, Copy, Clone)] struct Points(i32); impl std::iter::Sum<u8> for Points { fn sum<I>(iter: I) -> Points where I: Iterator<Item = u8>, { let mut pts = Points(0); for v in iter { pts.0 += v as i32; } pts } } fn main() { let total: Points = (0u8..42u8).sum(); println!("{:?}", total); }
&'a i8 -> i8
иi8 -> i8
и т. Д. – bluss 8 December 2016 в 11:24