繁体   English   中英

如何通过示例编写 Rust 中的转置 function 示例?

[英]How do I write the transpose function example from Rust by Example?

我正在关注示例教程中的 Rust,并且正在参加元组活动的第二部分,即使用reverse ZC1C425268E68385D1AB5074C17A94F14 添加transpose function。 这将接受一个矩阵作为参数并返回一个交换了两个元素的矩阵。 例如:

println!("Matrix:\n{}", matrix);
println!("Transpose:\n{}", transpose(matrix));

预期成绩:

Input Matrix:
( 1.1 1.2 2.1 2.2 )
Transposed output:
( 1.1 2.1 1.2 2.2 )

我找不到正确的代码,这是我正在尝试的:

// this is defined in the tutorial
#[derive(Debug)]
struct Matrix(f32, f32, f32, f32);

// this is my attempt that does not compile
fn transpose(maat: Matrix) -> (Matrix) {
    let matrix = maat;
    (matrix.0, matrix.2, matrix.1, matrix.3)
}

我不想为您提供完整的解决方案,因为如果您正在学习Rust,我会给您带来损害。 在本教程的这一点上,您缺少一个关键要素。 不是你的错。

Matrix是一个“元组结构”(有时也称为新类型),在Rust的后面部分将通过示例进行介绍。 如果您想先睹为快,则在结构部分中,您将学习缺失的两个部分。

第一步struct Matrix(f32, f32, f32, f32); 可以按照与简单元组类似的方式来解构本教程中定义的。

如果您有一个let matrix = Matrix(1.1, 1.2, 2.1, 2.2); 您可以执行以下操作为其单个元素创建名称:

let Matrix(r1c1, r2c2, r2c1, r2c2) = matrix

matrix.0 ,您所做的工作( matrix.0matrix.1 ...)也能工作

第二部分 当您要创建Matrix的新实例时,可以执行Matrix(1.1, 1.2, 2.1, 2.2) 从尝试编写转置开始,您试图返回一个元组,但是像Matrix这样的元组结构是不同的,不兼容的类型(这就是为什么它也称为“新类型”的原因)

reverse为例,重写reverse功能以接受f32

fn reverse(pair: (f32, f32)) -> (f32, f32) {
    let (a, b) = pair;
    (b, a)
}

fn transpose(mat: Matrix) -> Matrix {
    let (a, b) = reverse((mat.1, mat.2));
    Matrix(mat.0, a, b, mat.3)
}

你需要在这里做三件事:

  1. 告诉显示格式如何构造 output 以便它将矩阵分成两行等长。
 impl fmt::Display for Matrix { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write,(f, "( {} {} )\n( {} {} )". self,0. self,1. self,2. self.3) } }
  1. 编写转置 function 以转置顺序返回矩阵。
 fn transpose(mat: Matrix) -> Matrix { return Matrix(mat.0, mat.2, mat.1, mat.3); }
  1. 在 println 中调用它

println:("Transpose,\n{}"; transpose(matrix));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM