Você pode fornecer valores padrão para sua estrutura, implementando o Default
trait. A default
função seria semelhante à sua new
função atual :
impl Default for cParams {
fn default() -> cParams {
cParams {
iInsertMax: -1,
iUpdateMax: -1,
iDeleteMax: -1,
iInstanceMax: -1,
tFirstInstance: false,
tCreateTables: false,
tContinue: false,
}
}
}
Você pode então instanciar a estrutura fornecendo apenas os valores não padrão:
let p = cParams { iInsertMax: 10, ..Default::default() };
Com algumas pequenas alterações em sua estrutura de dados, você pode tirar proveito de uma implementação padrão derivada automaticamente. Se você usar #[derive(Default)]
em uma estrutura de dados, o compilador criará automaticamente uma função padrão para você que preenche cada campo com seu valor padrão. O valor booleano padrão é falso, o valor integral padrão é 0.
O valor padrão de um inteiro sendo 0 é um problema aqui, pois você deseja que os campos inteiros sejam -1 por padrão. Você pode definir um novo tipo que implemente um valor padrão de -1 e usar isso em vez de i64
em sua estrutura. (Eu não testei isso, mas deve funcionar).
No entanto, sugiro alterar ligeiramente sua estrutura de dados e usar em Option<i64>
vez de i64
. Não sei o contexto do seu código, mas parece que você está usando o valor especial -1 para representar o significado especial "infinito" ou "não há máximo". Em Rust, usamos um Option
para representar um valor presente opcional. Não há necessidade de um hack -1. Uma opção pode ser None
ou Some(x)
onde x seria o seu i64
aqui. Pode até ser um inteiro sem sinal se -1 for o único valor negativo. O Option
valor padrão é None
, portanto, com as alterações propostas, seu código poderia ser assim:
#[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() };