我想創建我自己的矢量struct
,所以我可以附加額外的方法。如何在Rust中創建包裝的矢量的新實例?
pub struct MyStructVec(pub Vec<MyStruct>);
完成此操作後,將如何創建此矢量的新實例?
MyStructVec::new()
未被識別。現有的矢量創建方法如何與這種類型一起使用? (new
,with_capacity
...等)
我想創建我自己的矢量struct
,所以我可以附加額外的方法。如何在Rust中創建包裝的矢量的新實例?
pub struct MyStructVec(pub Vec<MyStruct>);
完成此操作後,將如何創建此矢量的新實例?
MyStructVec::new()
未被識別。現有的矢量創建方法如何與這種類型一起使用? (new
,with_capacity
...等)
新類型「隱藏」它的內部。你不能透明地訪問內部。要創建的MyStructVec
一個新的對象,你需要調用內部類的構造函數,然後把它包:
MyStructVec(Vec::new())
MyStructVec(Vec::with_capacity(42))
創建這樣一個對象後,你可以通過實現Deref
和DerefMut
爲使用對象有點透明的類型:
impl std::ops::Deref for MyStructVec {
type Target = Vec<MyStruct>;
fn deref(&self) -> &Vec<MyStruct> {
&self.0
}
}
impl std::ops::DerefMut for MyStructVec {
fn deref_mut(&mut self) -> &mut Vec<MyStruct> {
&mut self.0
}
}
所以我可以附加額外的方法
這不是新型的使用方式。 Newtypes用於類型安全。如果你想要的是所有Vec<MyStruct>
有新的方法,創建擴展特性:
trait VecMyStructExt {
fn foo(&self);
}
impl VecMyStructExt for Vec<MyStruct> {
fn foo(&self) { println!("foo"); }
}
MyStructVec::new()
無法識別。
確實,因爲您已經定義了一個新類型,但尚未定義任何方法。你可以這樣做很容易:
impl MyStructVec {
pub fn new() -> MyStructVec {
MyStructVec(Vec::new())
}
}
,但在對方的回答說,你不用直接拿到包裝類型的方法,在你的新的結構直接,所以你需要換你想要的人。 (在某些情況下,您可能會在某種程度上使用宏自動化)