[英]Assign a parameter value to many struct members in a contructor similar function Rust
我在使用泛型類型創建簡單結構時遇到問題,如下所示:
struct Point3<T> {
pub x: T,
pub y: T,
pub z: T,
}
impl<T> Point3<T>
{
fn create3(vx: T, vy: T, vz: T) -> Point3<T> {
Point3::<T> {
x: vx,
y: vy,
z: vz,
}
}
fn create1(v: T) -> Point3<T> {
Point3::<T> {
x: v,
y: v,
z: v,
}
}
}
但是當我嘗試編譯它時,我得到了一個錯誤:
fn create1(v: T) -> Point3<T> {
| - move occurs because `v` has type `T`, which does not implement the `Copy` trait
34 | Point3::<T> {
35 | x: v,
| - value moved here
36 | y: v,
| ^ value used here after move
我了解v
在x
中移動,因此不適用於y
或z
。 所以看來我需要復制它,但我不知道該怎么做,也不知道T
的Copy
特性,因為它是通用類型
如果我通過 ref 傳遞v
我有另一個錯誤
我敢肯定它很簡單,但是 ac/c++ dev rust 目前對我來說很復雜:)
使用類型參數時,Rust 唯一假設的類型是它是Sized
。 必須明確寫出對類型參數的任何其他約束。
此外,Rust 的默認移動語義意味着一個值只能有一個所有者,並且一旦一個值被“移出”一個地方,它就不再有效。 您可以通過實現Copy
來選擇退出此行為,盡管這僅對可以有意義地memcpy
-ed 的類型有效,因此很多東西不能使用它(任何帶有Drop
impl、 &mut T
等的東西)。 TLDR,穿上 API 是一個相當嚴格的限制。
更一般的情況是Clone
,它是Copy
的超特征(這意味着:任何實現Copy
的T
也實現Clone
)。 不同之處在於Clone
可能是一項昂貴的操作,可能需要堆分配,並且必須通過Clone::clone
顯式調用,但代價是它的適用范圍要廣得多。
所以我建議按如下方式重寫您的代碼:
// this function doesn't need to impose any special bounds on T,
// since it never needs to be cloned
impl<T> Point3<T> {
fn create3(x: T, y: T, z: T) -> Self {
Self { x, y, z }
}
}
// this function does require clone, so we have to add the bound
impl<T: Clone> Point3<T> {
fn create1(v: T) -> Self {
Self {
x: v.clone(),
y: v.clone(),
z: v,
}
}
}
這允許您的 API 被更多的類型使用,但也不會為Copy
類型增加任何性能開銷,因為同樣是Copy
的類型的Clone
實現基本上是標准的memcpy
。
誠然,對於名為Point3
的結構,它可能只會用於數字,因此Copy
與Clone
的區別不是很相關,但在一般情況下, Clone
邊界的使用范圍更廣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.