формы, например.

с Diesel, я застрял, написав функцию, которая принимает векторStrings в качестве входных данных и выполняет следующие действия:

Объединить всеStringс большим запросомвыполнить запрос наConnectionобработать результатвернутьVec

Если я создаю запрос за один шаг, он работает просто отлично:

fn get_books(authors: Vec<String>, connection: SqliteConnection) {
    use schema::ebook::dsl::*;

    let inner = author
        .like(format!("%{}%", authors[0]))
        .and(author.like(format!("%{}%", authors[1])))
        .and(author.like(format!("%{}%", authors[2])));

    ebook
        .filter(inner)
        .load::<Ebook>(&connection)
        .expect("Error loading ebook");
}

Если я попытаюсь сгенерировать запрос несколькими шагами (необходим для работы с переменной длиной входного вектора), я не смогу его скомпилировать:

fn get_books(authors: Vec<String>, connection: SqliteConnection) {
    use schema::ebook::dsl::*;

    let mut inner = author
        .like(format!("%{}%", authors[0]))
        .and(author.like(format!("%{}%", authors[1]))); // <1>

    inner = inner.and(author.like(format!("%{}%", authors[2]))); // <2>

    ebook
        .filter(inner)
        .load::<Ebook>(&connection)
        .expect("Error loading ebook");
}

Это приводит к следующей ошибке:

inner = inner.and(author.like(format!("%{}%",authors[2])));
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `diesel::expression::operators::Like`, found struct `diesel::expression::operators::And`

Я не понимаю, почему Руст ожидаетLike и неAnd, Функция и линия помечены<1> возвращаетAnd и, следовательно,And хранится вinner.

Чего мне не хватает? Почему первый фрагмент кода компилируется, а второй нет? Как правильно создать такой запрос?

Ответы на вопрос(1)

Ваш ответ на вопрос