一、一个实际问题
用一个线性代数库的求逆矩阵函数时,让我很不爽,我必须按照下面的形式写调用代码:
...
if let Some(inv_mat) = try_inverse(mat.clone()) {...}
...
注意 try_inverse
函数的参数传递形式,函数参数是 mat.clone()
而不是 mat
,因为这个 mat
变量后面我还得使用。有看了几个其他的线性代数库,大都是按照这个形式定义的。我不得不思考一下为什么要这么干。
我们看这个函数的几种可能的声明形式:
fn try_inverse(mat: Mat) -> Option<Mat> {...} // .... (1)
fn try_inverse(mat: &Mat) -> Option<Mat> {...} // .... (2)
fn try_inverse(mat: &mut Mat) -> Option<Mat> {...} // .... (3)
下面分别讨论:
1、fn try_inverse(mat: Mat) -> Option
我们有两种办法向函数传递参数。如果 mat
函数调用后不再使用,可以直接把变量所有权转移给函数,按下面形式调用:
...
if let Some(inv_mat) = try_inverse(mat) {...}
...
如果 mat 在函数调用后还有别的用途,必须保留变量所有权,把变量克隆一份传递给函数,按照下面的方法调用:
...
if let Some(inv