Вот пример в простом старом 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
Дженерики не легки. Дженерики в такой универсальной системе, как Diesel, еще сложнее.
Я предпочитаю разбивать ступени на очень мелких деталей и избегать как можно большего количества цепочек. С этим в игре вам нужно будет добавить границы черт для каждого шага. Хорошая вещь - использовать / создавать псевдонимы типов для очень сложных границ признаков. Diesel предоставляет несколько таких , и вы можете сделать свой собственный для своих особых целей.
Хотя я смотрел на сгенерированные сообщения об ошибках, я в основном смотрел на границы типов, описываемые вызываемыми функциями / методами.
По точкам:
.find
происходит от FindDsl
. delete
требуется IntoUpdateTarget
. delete
- это DeleteStatement
, параметризованный с помощью T::Table
и T::WhereClause
. Это псевдоним пользовательского типа DeleteFindStatement
. .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
; как показано в вашем сообщении об ошибке.
См. Также:
Есть ли преимущество в том, что первичный ключ является универсальным, даже если он
blockquote>&str
во всех случаях?Для меня проще использовать универсальный тип, чем вставить набор общих параметров времени жизни.