Możesz podać wartości domyślne dla swojej struktury, implementując Default
cechę. default
Funkcja będzie wyglądać aktualnej new
funkcji:
impl Default for cParams {
fn default() -> cParams {
cParams {
iInsertMax: -1,
iUpdateMax: -1,
iDeleteMax: -1,
iInstanceMax: -1,
tFirstInstance: false,
tCreateTables: false,
tContinue: false,
}
}
}
Następnie możesz utworzyć wystąpienie struktury, podając tylko wartości inne niż domyślne:
let p = cParams { iInsertMax: 10, ..Default::default() };
Po wprowadzeniu niewielkich zmian w strukturze danych można skorzystać z domyślnej implementacji wyprowadzonej automatycznie. Jeśli używasz #[derive(Default)]
struktury danych, kompilator automatycznie utworzy domyślną funkcję, która wypełni każde pole wartością domyślną. Domyślna wartość logiczna to fałsz, a domyślna wartość całkowita to 0.
Domyślna wartość liczby całkowitej wynosząca 0 jest tutaj problemem, ponieważ chcesz, aby pola liczb całkowitych miały domyślnie wartość -1. Możesz zdefiniować nowy typ, który implementuje domyślną wartość -1 i użyć tego zamiast i64
w swojej strukturze. (Nie testowałem tego, ale powinno działać).
Sugerowałbym jednak nieznaczną zmianę struktury danych i użycie Option<i64>
zamiast i64
. Nie znam kontekstu Twojego kodu, ale wygląda na to, że używasz specjalnej wartości -1 do reprezentowania specjalnego znaczenia „nieskończony” lub „nie ma maksimum”. W Rust używamy znaku an Option
do reprezentowania opcjonalnej wartości bieżącej. Nie ma potrzeby hakowania -1. Opcją może być albo None
albo Some(x)
gdzie x będzie i64
tutaj twoje . Może to być nawet liczba całkowita bez znaku, jeśli -1 była jedyną wartością ujemną. Wartość domyślna Option
to None
, więc przy proponowanych zmianach Twój kod mógłby wyglądać następująco:
#[derive(Default)]
struct cParams {
iInsertMax: Option<u64>,
iUpdateMax: Option<u64>,
iDeleteMax: Option<u64>,
iInstanceMax: Option<u64>,
tFirstInstance: bool,
tCreateTables: bool,
tContinue: bool,
}
let p = cParams { iInsertMax: Some(10), ..Default::default() };