Ошибка при вычислении Получение среднего количества кусков [дубликатов]

По умолчанию security security использует сопоставление стиля муравьев, которое не может соответствовать параметрам. Однако сопоставление в регксе может соответствовать параметрам

Попробуйте определить его так:


  

Не знаю, почему Roo не делает этого автоматически. Похоже, это должно быть.

9
задан Boiethios 7 December 2016 в 21:04
поделиться

1 ответ

, а затем 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);
}
5
ответ дан Shepmaster 17 August 2018 в 12:21
поделиться
  • 1
    Я думаю, что логический шаг отсутствует. Просто потому, что несколько типов хотят суммировать одно и то же, не означает, что должен быть другой параметр типа. Его можно решить с помощью ассоциированного типа &'a i8 -> i8 и i8 -> i8 и т. Д. – bluss 8 December 2016 в 11:24
  • 2
    @bluss очень хороший момент! – Shepmaster 8 December 2016 в 15:27
  • 3
    Благодарю. Я имею в виду, это не ваша проблема, это в библиотеке, но поскольку этот ответ был своего рода шагом по его рационализации, я хотел бы указать на это. Рационализируя существо, которое существует, вероятно, путь к счастью в любом случае ;-) – bluss 8 December 2016 в 21:45
Другие вопросы по тегам:

Похожие вопросы: