Bạn có thể cung cấp các giá trị mặc định cho cấu trúc của mình bằng cách triển khai Default
đặc điểm. Các default
chức năng sẽ trông như thế hiện tại của bạn new
chức năng:
impl Default for cParams {
fn default() -> cParams {
cParams {
iInsertMax: -1,
iUpdateMax: -1,
iDeleteMax: -1,
iInstanceMax: -1,
tFirstInstance: false,
tCreateTables: false,
tContinue: false,
}
}
}
Sau đó, bạn có thể khởi tạo cấu trúc bằng cách chỉ cung cấp các giá trị không mặc định:
let p = cParams { iInsertMax: 10, ..Default::default() };
Với một số thay đổi nhỏ đối với cấu trúc dữ liệu của bạn, bạn có thể tận dụng lợi thế của việc triển khai mặc định được dẫn xuất tự động. Nếu bạn sử dụng #[derive(Default)]
trên một cấu trúc dữ liệu, trình biên dịch sẽ tự động tạo một hàm mặc định cho bạn để điền vào mỗi trường với giá trị mặc định của nó. Giá trị boolean mặc định là false, giá trị tích phân mặc định là 0.
Giá trị mặc định của một số nguyên là 0 là một vấn đề ở đây vì bạn muốn các trường số nguyên là -1 theo mặc định. Bạn có thể xác định một kiểu mới thực hiện giá trị mặc định là -1 và sử dụng giá trị đó thay vì i64
trong cấu trúc của bạn. (Tôi chưa thử nghiệm điều đó, nhưng nó sẽ hoạt động).
Tuy nhiên, tôi khuyên bạn nên thay đổi một chút cấu trúc dữ liệu của bạn và sử dụng Option<i64>
thay vì i64
. Tôi không biết ngữ cảnh mã của bạn, nhưng có vẻ như bạn đang sử dụng giá trị đặc biệt của -1 để biểu thị ý nghĩa đặc biệt "vô hạn" hoặc "không có giá trị tối đa". Trong Rust, chúng tôi sử dụng một Option
để đại diện cho một giá trị hiện tại tùy chọn. Không cần phải hack -1. Một tùy chọn có thể là một trong hai None
hoặc Some(x)
trong đó x sẽ là của bạn i64
ở đây. Nó thậm chí có thể là một số nguyên không dấu nếu -1 là giá trị âm duy nhất. Option
Giá trị mặc định là None
, vì vậy với các thay đổi được đề xuất, mã của bạn có thể trông giống như sau:
#[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() };