Rust 作为可选函数参数的引用
我试图实现一个带有可选引用的函数。我希望能够像这样使用它:Rust 作为可选函数参数的引用,rust,Rust,我试图实现一个带有可选引用的函数。我希望能够像这样使用它: fn main() { let x = 557483943; test_function(x, None); let params = parameters(x); test_function(x, Some(¶ms)); } 其中参数(x)可能需要一些时间才能执行。因此,我希望能够传递一个可选的函数引用。目前,我将其用作测试代码: #[derive(Debug)] pub stru
fn main() {
let x = 557483943;
test_function(x, None);
let params = parameters(x);
test_function(x, Some(¶ms));
}
其中参数(x)
可能需要一些时间才能执行。因此,我希望能够传递一个可选的函数引用。目前,我将其用作测试代码:
#[derive(Debug)]
pub struct Parameters {
a: u32,
b: u32,
}
pub fn parameters(x: u32) -> Parameters {
// would be a tedious calculation...
let a = x / 6453;
let b = x % 589703;
Parameters { a, b }
}
我想到的是:
pub fn test_function(x: u32, params: Option<&Parameters>) {
// tmp_params is needed as owner of the return value of
// parameters(x) that outlives the match statement
let tmp_params: Parameters;
let params = match params {
Some(params) => params,
None => {
tmp_params = parameters(x);
&tmp_params
},
};
println!("params: {:?}", ¶ms);
}
pub fn test_函数(x:u32,参数:Option){
//tmp_参数需要作为的返回值的所有者
//超出匹配语句的参数(x)
设tmp_参数:参数;
设params=匹配params{
一些(参数)=>参数,
无=>{
tmp_params=参数(x);
&tmp_参数
},
};
println!(“参数:{:?},¶ms);
}
这是可行的,但我不确定这是否是rust中的惯用方法
是否有办法避免tmp_参数
,并使match
语句中创建的参数
比match
语句本身更有效
是否有更好/更惯用的方法来实现这一点?是否有理由希望使用
选项
,而不仅仅是选项
。使用选项引用,如果使用None
为params
调用test_函数
,则参数将在本地创建,并在调用结束时销毁。如果您可以包含关于您的用例的更多周围信息,那么可能有一种完全不同的方法来实现这一点。否则,根据上下文,您当前的方法似乎是合理的。@sshashank124我不想将params
移动到test\u函数中params
需要在函数调用后可用(如我在println!(
行中的示例)。我的问题是,您的代码很奇怪,目前代码中的代码更好。>更清楚地说,为什么test_function
会创建一个“default”参数,然后将其删除?特别是如果需要时间来创建。另一方面,为什么不让用户来做呢?好吧,在这种情况下,使用hashmap,比如或者使用一个元函数来处理函数的缓存,或者在这种情况下,您所拥有的是非常好的。虽然我同意@Stargateur,但这是一组有点奇怪的要求。您希望使用选项而不仅仅是选项是有原因的。使用选项引用,如果使用None
为params
调用test_函数
,则参数将在本地创建,并在调用结束时销毁。如果您可以包含关于您的用例的更多周围信息,那么可能有一种完全不同的方法来实现这一点。否则,根据上下文,您当前的方法似乎是合理的。@sshashank124我不想将params
移动到test\u函数中params
需要在函数调用后可用(如我在println!(
行中的示例)。我的问题是,您的代码很奇怪,目前代码中的代码更好。>更清楚地说,为什么test_function
会创建一个“default”参数,然后将其删除?特别是如果需要时间来创建。另一方面,为什么不让用户来做呢?好吧,在这种情况下,使用hashmap,比如或者使用一个元函数来处理函数的缓存,或者在这种情况下,您所拥有的是非常好的。虽然我同意@Stargateur,但它的要求有点奇怪