如何通过示例从Rust生成转置函数示例?

问题描述:

我遵循Rust by Example教程,并在Tuples activity的第二部分中添加使用reverse函数作为模板的transpose函数。这将接受一个矩阵作为参数,并返回一个矩阵,其中两个元素已被交换。例如:如何通过示例从Rust生成转置函数示例?

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) 
} 
+3

为了加快我们的帮助:你的代码是什么输出/出了什么问题? – birryree

+0

请查看如何创建[MCVE]。例如,绝大多数'main'函数对你的问题没有影响。 – Shepmaster

我不想给你完整的解决方案,因为如果你正在学习Rust,我会对你有所帮助。 在本教程的这一点,您缺少一个关键因素。不是你的错。

矩阵是一个“元组结构”(有时也被称为newtype),它在后面的例子中被Rust覆盖。 如果你想偷看,在section on structs你会学到你失踪的两件。

第一块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.0matrix.1 ...)工作过,但...

第二块。当你想创建一个Matrix的新实例时,你需要做Matrix(1.1, 1.2, 2.1, 2.2)。从你尝试写转置你试图返回一个元组,但是像一个元组结构像Matrix是一个不同的,不兼容的类型(这就是为什么它也被称为“新类型”)