Struct 在Rust中将结构作为参数传递

Struct 在Rust中将结构作为参数传递,struct,rust,reference,ownership,Struct,Rust,Reference,Ownership,我正在锈迹斑斑中从头开始构建图形引擎。 我有一个结构点: struct Point { x: i32, y: i32 } 还有一个三角形结构,它只有三个点: struct Triangle (Point,Point,Point) 我制作了一个trait引擎,稍后将使用SDL实现它 trait Engine { fn draw_triangle(&self,tri:Triangle){ self.draw_line(tri.0,tri.1); self

我正在锈迹斑斑中从头开始构建图形引擎。
我有一个结构点:

struct Point {
  x: i32,
  y: i32
}
还有一个三角形结构,它只有三个点:

struct Triangle (Point,Point,Point)

我制作了一个trait引擎,稍后将使用SDL实现它

trait Engine {
  fn draw_triangle(&self,tri:Triangle){
     self.draw_line(tri.0,tri.1);
     self.draw_line(tri.1,tri.2); // <-
     self.draw_line(tri.2,tri.0);
  }
  fn draw_line(&self,p1:Point,p2:Point)

}
trait引擎{
fn绘制三角形(&self,tri:triangle){
自绘制线(tri.0,tri.1);

self.draw_-line(tri.1,tri.2);//在第一个
draw_-line
调用中,您传递两个点
tri.0
tri.1
。这会将变量“移动”到
draw_-line
函数中,之后不能使用它们。有两种方法可以避免这样做

首先,调用函数时,只需在
结构点
行上方添加
#[派生(克隆,复制)]
即可复制(或克隆)点。这允许显式克隆点(使用
.clone()
方法)或者隐式复制。这意味着每次将数据传递到函数时都会复制数据,在本例中这不是什么大问题。但是,对于较大的结构,需要避免这种情况,因此可以使用以下方法

其次,您可以将点作为参考而不是按值传递。这可以通过更改
绘制线
签名以接受点参考来实现,如下所示:

fn绘制线(&self,p1:&Point,p2:&Point);
但是,这意味着您现在还需要通过引用传递点,从而得到以下特征定义:

trait引擎{
fn绘制三角形(&self,tri:triangle){
自绘制线(&tri.0和&tri.1);
自绘制线(&tri.1和&tri.2);
自绘制线(&tri.2和&tri.0);
}
fn绘制线(&self,p1:&Point,p2:&Point);
}
这会导致点本身不会被传递到函数中,而是对单个点的引用-这意味着结构不需要复制六次(每次函数调用两次)。如果此方法被多次调用,或者结构更大,这可能是一个显著的加速


rust book的下一章详细解释了所有权、参考资料和借阅:。

欢迎来到StackOverflow!您读过关于rust的书吗,如官方书籍或O'Reilly的“编程rust”?这两本书都很好地解释了移动的概念,足以让您理解解决方案(如您所愿)。解决方案是在
结构点的定义上方添加
#[派生(复制、克隆)]
。这将使
点的行为更像一个非常简单的原始对象(如数字或布尔),允许通过复制而不是移动将其传递给函数。