如何通过示例从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)
}
答
我不想给你完整的解决方案,因为如果你正在学习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.0
,matrix.1
...)工作过,但...
第二块。当你想创建一个Matrix
的新实例时,你需要做Matrix(1.1, 1.2, 2.1, 2.2)
。从你尝试写转置你试图返回一个元组,但是像一个元组结构像Matrix
是一个不同的,不兼容的类型(这就是为什么它也被称为“新类型”)
为了加快我们的帮助:你的代码是什么输出/出了什么问题? – birryree
请查看如何创建[MCVE]。例如,绝大多数'main'函数对你的问题没有影响。 – Shepmaster