Общее использование поиска или фильтра Diesel для удаления

Вот пример в простом старом C ++. Сначала я создаю вектор диапазонов для каждого измерения под названием maxes. если сумма всех индексов равна 2, то я печатаю что-то. В примере I цикл z от 0 до 1, y от 0 до 2, x от 0 до 3

Вы можете точно сделать это более аккуратным.

Здесь идет:

#include <iostream>
#include <vector>
using namespace std;

int f(){ 
    return 2 ;
}

void inner(int depth,vector<int> & numbers,vector<int> & maxes){
  if (depth>0){
     for(int i=0;i<maxes[depth-1];i++){
        numbers[depth-1]=i;
        inner(depth-1, numbers,maxes) ;
     }
  }else{
     // calculate sum of x,y,z:
     cout << "values are ";
     for(int i=0;i<numbers.size();i++){
        cout <<numbers[i]<<" ";
     }
     int thesum(0);
     for(int i=0;i<numbers.size();i++){
        thesum+=numbers[i];
     }
     if (thesum==f()){
        cout << "did something! ";
     }
     cout<<endl;
   }
}

void donest(){
   vector<int>  numbers;
   numbers.resize(3);
   vector<int>  maxes;
   maxes.push_back(4);
   maxes.push_back(3);
   maxes.push_back(2);
   inner(numbers.size(),numbers,maxes);
}

int main(){
   donest();
}

результат:

values are 0 0 0 
values are 1 0 0 
values are 2 0 0  did something! 
values are 3 0 0 
values are 0 1 0 
values are 1 1 0  did something! 
values are 2 1 0 
values are 3 1 0 
values are 0 2 0  did something! 
values are 1 2 0 
values are 2 2 0 
values are 3 2 0 
values are 0 0 1 
values are 1 0 1  did something! 
values are 2 0 1 
values are 3 0 1 
values are 0 1 1  did something! 
values are 1 1 1 
values are 2 1 1 
values are 3 1 1 
values are 0 2 1 
values are 1 2 1 
values are 2 2 1 
values are 3 2 1 
0
задан Shepmaster 18 March 2019 в 01:08
поделиться

1 ответ

Дженерики не легки. Дженерики в такой универсальной системе, как Diesel, еще сложнее.

Я предпочитаю разбивать ступени на очень мелких деталей и избегать как можно большего количества цепочек. С этим в игре вам нужно будет добавить границы черт для каждого шага. Хорошая вещь - использовать / создавать псевдонимы типов для очень сложных границ признаков. Diesel предоставляет несколько таких , и вы можете сделать свой собственный для своих особых целей.

Хотя я смотрел на сгенерированные сообщения об ошибках, я в основном смотрел на границы типов, описываемые вызываемыми функциями / методами.

По точкам:

  1. .find происходит от FindDsl .
  2. delete требуется IntoUpdateTarget .
  3. Результирующий тип вызова delete - это DeleteStatement , параметризованный с помощью T::Table и T::WhereClause. Это псевдоним пользовательского типа DeleteFindStatement.
  4. .execute происходит от ExecuteDsl .
use diesel::{
    associations::HasTable,
    helper_types::Find,
    query_builder::{DeleteStatement, IntoUpdateTarget},
    query_dsl::methods::ExecuteDsl,
};

type DeleteFindStatement<F> =
    DeleteStatement<<F as HasTable>::Table, <F as IntoUpdateTarget>::WhereClause>;

impl DB {
    pub fn remove_row<Tbl, Pk>(&self, table: Tbl, pk: Pk) -> Result<(), Box<Error>>
    where
        Tbl: FindDsl<Pk>,
        Find<Tbl, Pk>: IntoUpdateTarget,
        DeleteFindStatement<Find<Tbl, Pk>>: ExecuteDsl<SqliteConnection>,
    {
        let find = table.find(pk);
        let delete = diesel::delete(find);
        delete.execute(&self.conn)?;
        Ok(())
    }
}

Вам нужно будет попробовать его самостоятельно для версии filter, так как вы не предоставили достаточно кода, чтобы сказать, каким должен быть id; как показано в вашем сообщении об ошибке.

См. Также:

Есть ли преимущество в том, что первичный ключ является универсальным, даже если он &str во всех случаях?

Для меня проще использовать универсальный тип, чем вставить набор общих параметров времени жизни.

0
ответ дан Shepmaster 18 March 2019 в 01:08
поделиться
Другие вопросы по тегам:

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