2017-07-10 25 views
8

Nói rằng tôi xác định loại của riêng tôi trong một thư viện Rust, như vậy:Tắt hàm tạo mặc định trong Rust?

struct Date { 
    year: u16, 
    month: u8, 
    day: u8 
} 

impl Date { 
    fn new(y: u16, m: u8, d: u8) -> Date { 
     // Do some validation here first 
     Date { year: y, month: m, day: d } 
    } 
} 

Có cách nào để yêu cầu người dùng sử dụng các nhà xây dựng Date::new? Nói cách khác, tôi làm cách nào cấm người dùng tạo ngày struct riêng của họ với các nhà xây dựng mặc định như vậy:

let d = Date { 2017, 7, 10 }; 

Tôi hỏi vì nó có vẻ là một lỗ hổng có hại nếu bạn không thể ép buộc các nhà phát triển để chạy lập luận của họ thông qua một pin xác nhận trước khi thiết lập các thành viên của một cấu trúc. (Mặc dù, có thể có một số mẫu khác mà tôi nên sử dụng trong Rust, chẳng hạn như xác thực dữ liệu khi chúng được sử dụng thay vì khi chúng được tạo; vui lòng nhận xét về điều đó.)

+3

Điều này thường không được gọi là "hàm tạo mặc định"; điều đó có nghĩa là 'Date :: default' (từ [Default' trait] (https://doc.rust-lang.org/std/default/trait.Default.html)). Tôi có lẽ chỉ cần gọi cú pháp này là "struct literal syntax". – Shepmaster

Trả lời

9

TL; DR: The "default constructor "được tắt theo mặc định.

Cú pháp struct chỉ khả dụng cho những người có quyền truy cập tất cả các trường của struct.

Kết quả là chỉ có thể truy cập trong cùng một mô-đun, theo quy tắc bảo mật, trừ khi tất cả các trường được đánh dấu pub trong trường hợp này có thể truy cập ở bất kỳ nơi nào struct.

Lưu ý rằng điều này cũng đúng với các chức năng , kể từ new không được đánh dấu pub tại đây, không thể truy cập bất kỳ mô-đun nào khác ngoài mô-đun hiện tại.

+0

Ah! Xuất sắc. Cảm ơn ngài! –

+0

@JonathanWilbur: Bạn được chào đón nhiều nhất :) –

+0

@ 8bittree: Không, đó là trừ khi. Hãy để tôi hội đủ điều kiện nó nhiều hơn một chút. –

Các vấn đề liên quan