Tôi có một vấn đề thiết kế, khi sử dụng một cái gì đó như:Làm thế nào để thực hiện một đặc điểm cho một đặc điểm tham số
trait MyTrait<K: OtherTrait> { ... }
impl<K: OtherTrait, M: MyTrait<K>> AnyTrait for M { ... }
tôi có thể không thực hiện đặc điểm cho đặc điểm này do E207 lỗi ("tham số kiểu K
không bị hạn chế bởi đặc tính impl, kiểu tự, hoặc các vị từ ").
Tìm không có cách nào để thoát khỏi lỗi này, tôi áp dụng this not-so-good-looking workaround (verbose và struct không có giá trị nội tại):
use std::fmt;
use std::marker::PhantomData;
pub trait MyTrait<K: fmt::Display> {
fn get_some_k(&self) -> Option<K>;
}
/* // This is my target impl but results in E207 due to K not constrained
impl<K: fmt::Display, S: MyTrait<K>> fmt::Display for S {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.get_some_k().unwrap())
}
} */
pub struct Ugly<'a, K: fmt::Display, S: 'a + MyTrait<K>>(&'a S, PhantomData<K>);
impl<'a, K: fmt::Display, S: MyTrait<K>> fmt::Display for Ugly<'a, K, S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0.get_some_k().unwrap())
}
}
fn main() { }
Tôi nghĩ rằng không nên có một số cách đẹp hơn để thực hiện một đặc điểm cho các loại hình đặc điểm tham số.
Tôi không tìm thấy ví dụ điển hình trong tiêu chuẩn (ví dụ: không triển khai Display
trong các đặc điểm có loại được liên kết như Iterator
)?
Chỉ cần nghĩ rằng tôi muốn đề cập đến tôi đang chạy vào cùng một vấn đề chính xác, tuy nhiên tôi không có sự sang trọng của gói chăn impl trong một 'Ugly', như' MyTrait' là một đặc điểm công khai tiếp xúc với người dùng, và yêu cầu họ sử dụng 'Ugly' triệt để phá hủy API bằng cách thêm sự phức tạp không cần thiết. – mindTree
Bản sao có thể có của [Cung cấp triển khai thực hiện chăn nuôi cho một đặc điểm tùy chỉnh] (http://stackoverflow.com/questions/32430659/providing-blanket-trait-implementations-for-a-custom-trait) – wimh