Как использовать Itertools для создания всех комбинаций диапазона дат Chrono? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь сгенерировать все комбинации диапазона дат, используя Rust itertools , но он говорит, что границы признаков не были выполнены.

extern crate chrono;
extern crate itertools;

use itertools::Itertools;
use chrono::prelude::*;

fn main() {
    let min = NaiveDate::from_ymd(2018, 10, 1);
    let max = NaiveDate::from_ymd(2018, 10, 14);
    let combinations = (min..=max).combinations(5);
}

Сообщение об ошибке:

error[E0599]: no method named `combinations` found for type `std::ops::RangeInclusive<chrono::NaiveDate>` in the current scope
  --> src/main.rs:46:36
   |
46 |     let combinations = (min..=max).combinations(5);
   |                                    ^^^^^^^^^^^^
   |
   = note: the method `combinations` exists but the following trait bounds were not satisfied:
           `std::ops::RangeInclusive<chrono::NaiveDate> : itertools::Itertools`
           `&std::ops::RangeInclusive<chrono::NaiveDate> : itertools::Itertools`
           `&mut std::ops::RangeInclusive<chrono::NaiveDate> : itertools::Itertools`

Я ожидаю, что Itertools были реализованы для универсального RangeInclusive.Я изучаю Rust, поэтому я могу упустить что-то очевидное.

1 Ответ

0 голосов
/ 10 октября 2018

Itertools, как следует из названия, работает на Iterator s . невозможно создать итерируемый диапазон типа вне стандартной библиотеки в стабильном Rust (версия 1.29).

Вместо этого мы можем создать собственный итератор для диапазона дат, основанный на цикличности по датам

extern crate chrono; // 0.4.6
extern crate itertools; // 0.7.8

use chrono::{Duration, NaiveDate};
use itertools::Itertools;
use std::mem;

struct DateRange(NaiveDate, NaiveDate);

impl Iterator for DateRange {
    type Item = NaiveDate;
    fn next(&mut self) -> Option<Self::Item> {
        if self.0 < self.1 {
            let next = self.0 + Duration::days(1);
            Some(mem::replace(&mut self.0, next))
        } else {
            None
        }
    }
}

fn main() {
    let min = NaiveDate::from_ymd(2018, 10, 1);
    let max = NaiveDate::from_ymd(2018, 10, 14);
    let combinations: Vec<_> = DateRange(min, max).combinations(5).collect();
    println!("{:?}", combinations)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...