2016-12-12 17 views
8

Rust có một tính năng hữu ích trong đó bạn có thể sử dụng cấu trúc hiện có và chỉ ghi đè một số thành viên của cấu trúc đó. Ví dụ, một giá trị của cấu trúc sauLàm thế nào để khai báo một cấu trúc mà chỉ một số thành viên có thể sử dụng một giá trị từ cấu trúc khác?

struct SomeTool { 
    pub unique_id: String, 
    pub poll: Option<fn(&Context) -> bool>, 
    pub exec: Option<fn(&mut Context) -> ToolResult>, 
    pub modal: Option<fn(&mut Context) -> ToolResult>, 
    pub ui: Option<fn(&mut UIPanel)>, 
} 

có thể được khởi tạo bằng cách đi qua trong một trường hợp struct (ví dụ SomeTool::default()):

new_tool = SomeTool { 
    unique_id: "tool.foobar".to_string(), 
    exec: Some(foobar_exec) 
    .. SomeTool::default() 
}; 

Tôi muốn để có thể tuyên bố SomeTool mà không cần phải rõ ràng danh sách mọi cuộc gọi lại (thêm các cuộc gọi lại mới trong tương lai có thể dẫn đến nhiều sự bổ sung của None trên tất cả một codebase).

Điều này hoạt động tốt, nhưng bây giờ tôi có thể vô tình bỏ qua unique_id để khởi tạo một số khác và nó sẽ sử dụng bất kỳ nội dung nào trong số default.

Có cách nào để mô tả cấu trúc có thể có một số thành viên bị ghi đè nhưng không phải là các thành viên khác không?


Lưu ý rằng trường hợp sử dụng thực tế có nhiều thành viên hơn số này (tạo cơ hội tai nạn cao hơn), đơn giản hóa cho câu hỏi.

Trả lời

8

unique_id của bạn được coi là duy nhất, nên không có phương thức khởi tạo Default. Nhưng nếu bạn loại bỏ các Default impl từ một loại giả thuyết UniqueId, sau đó bạn sẽ không thể lấy được Default cho SomeTool.

Giải pháp hiện đang làm việc là di chuyển tất cả các trường không yêu cầu giá trị cho cấu trúc phụ và không triển khai Default cho SomeTool. Vì vậy bạn sẽ có thể sử dụng SomeTool như sau:

new_tool = SomeTool { 
    unique_id: "tool.foobar".to_string(), 
    callbacks: Callbacks { 
     exec: Some(foobar_exec), 
     .. Callbacks::default() 
    } 
}; 

Có một tính năng giả thuyết rằng Rust có thể nhận được trong tương lai, cho phép bạn có hai cấu trúc với các lĩnh vực cùng là biểu hiện cơ sở trong một struct expression. Tính năng đó sẽ cho phép bạn sử dụng cấu trúc con để khởi tạo tất cả các trường mà cấu trúc con và SomeTool có điểm chung, nhưng không được sử dụng nhiều hơn.

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