john36allTa
@john36allTa
That`s calling Walker

Как правильно обработать rusqlite mappedrows?

Сделал по примеру, но ругается на типы данных, почему?
#[derive(Debug)]
pub struct Candle{
	pub timestamp: i32,
	pub open: f64,
	pub close:f64,
	pub min: f64,
	pub max: f64,
	pub ticks: Vec<CandleTick>
}
fn read()->Result<Vec<Candle>>{
	let conn = Connection::open("candles.db")?;
	let mut stmt = conn.prepare("SELECT * from candles limit 10")?;
    let res :Vec<Candle>= stmt.query_map(&[], |row| {
        Candle {
            timestamp: row.get(1).unwrap(),
            open: row.get(2).unwrap(),
            close: row.get(3).unwrap(),
            min: row.get(4).unwrap(),
            max: row.get(5).unwrap(),
            ticks: Vec::new()
        }
    })?;
    Ok(res)
}

unwrap добавил тоже из за ругани что должен быть Result
Вобщем ответ компилятора:
error[E0308]: mismatched types
  --> src/lib.rs:37:9
   |
37 | /         Candle {
38 | |             timestamp: row.get(1).unwrap(),
39 | |             open: row.get(2).unwrap(),
40 | |             close: row.get(3).unwrap(),
...  |
43 | |             ticks: Vec::new()
44 | |         }
   | |_________^ expected enum `std::result::Result`, found struct `Candle`
   |
   = note: expected type `std::result::Result<_, rusqlite::error::Error>`
              found type `Candle`

error[E0308]: try expression alternatives have incompatible types
  --> src/lib.rs:36:27
   |
36 |       let res :Vec<Candle>= stmt.query_map(&[], |row| {
   |  ___________________________^
37 | |         Candle {
38 | |             timestamp: row.get(1).unwrap(),
39 | |             open: row.get(2).unwrap(),
...  |
44 | |         }
45 | |     })?;
   | |_______^ expected struct `std::vec::Vec`, found struct `rusqlite::row::MappedRows`
   |
   = note: expected type `std::vec::Vec<Candle>`
              found type `rusqlite::row::MappedRows<'_, [closure@src/lib.rs:36:47: 45:6]>`

Тип для res обозначил "наобум" конечно..
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
Tyranron
@Tyranron
Туториал устарел. Лучше всегда читать официальную доку. Она в Rust очень удобная и в сообществе принято её хорошо сдабривать примерами.

Первая ошибка говорит о том, что Вы возвращаете Candle {...}, в то время как ожидается Result (это как раз устаревшая часть туториала). Просто сделайте Ok(Candle {...}) (пример с документации как раз подобное и показывает).

Вторая ошибка говорит о том, что Вы пытаетесь возвращаемый тип rusqlite::row::MappedRows подставить туда, где явно ожидаете Vec. Rust статически и строго типизированный язык, так не получится. По сути, Вам там просто нужно добавить .collect() после ?. Так как MappedRowsреализует Iterator, то .collect() как раз пробежится по всем значениям итератора и соберёт их в Vec, который Вам и нужен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
22 мая 2019, в 12:13
1 руб./за проект
22 мая 2019, в 12:12
200 руб./за проект
22 мая 2019, в 12:11
1 руб./за проект