簡體   English   中英

在類似 function Rust 的構造函數中為許多結構成員分配參數值

[英]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

我了解vx中移動,因此不適用於yz 所以看來我需要復制它,但我不知道該怎么做,也不知道TCopy特性,因為它是通用類型

如果我通過 ref 傳遞v我有另一個錯誤

我敢肯定它很簡單,但是 ac/c++ dev rust 目前對我來說很復雜:)

使用類型參數時,Rust 唯一假設的類型是它是Sized 必須明確寫出對類型參數的任何其他約束。

此外,Rust 的默認移動語義意味着一個值只能有一個所有者,並且一旦一個值被“移出”一個地方,它就不再有效。 您可以通過實現Copy來選擇退出此行為,盡管這僅對可以有意義地memcpy -ed 的類型有效,因此很多東西不能使用它(任何帶有Drop impl、 &mut T等的東西)。 TLDR,穿上 API 是一個相當嚴格的限制。

更一般的情況是Clone ,它是Copy的超特征(這意味着:任何實現CopyT也實現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的結構,它可能只會用於數字,因此CopyClone的區別不是很相關,但在一般情況下, Clone邊界的使用范圍更廣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM