gpt4 book ai didi

rust - if else 借入时临时值(value)下降

转载 作者:行者123 更新时间:2023-12-03 11:34:44 26 4
gpt4 key购买 nike

我正在使用 Rusqlite,它可以让你做这样的查询:

statement.query_row(params!([1, 2, 3]), ...);
params!()定义如下:
macro_rules! params {
() => {
$crate::NO_PARAMS
};
($($param:expr),+ $(,)?) => {
&[$(&$param as &dyn $crate::ToSql),+] as &[&dyn $crate::ToSql]
};
}
这很好用,但在某些情况下,我想做这样的事情:
statement.query_row(if x { params![1, 2, 3] } else { params![4, 5] }, ...
不幸的是,它不起作用 - 你得到一个 temporary value dropped while borrowed错误。我将问题简化为( playground ):
fn main() {
foo(&[&1, &2, &3]); // Fine!

let x = 1;
let y = true;

let a = if y {
&[&x, &2, &3]
} else {
&[&5, &6, &7]
};

foo(a); // Error
}

fn foo(_x: &[&i32]) {
}
这是有道理的,但它很烦人。我目前的解决方法基本上是这样的:
let params_a = params![1, 2, 3];
let params_b = params![4, 5];
statement.query_row(if x { params_a } else { params_b }, ...
但这有点糟糕。有没有更好的办法?

最佳答案

在 Rust 中,需要创建一个新绑定(bind)来延长临时对象的生命周期是很常见的。您的解决方案可能是最好的方法。rusqlite 的创建者crate 显然没有预料到这种用法 - 他们并没有让它变得容易。您可以创建自己的宏来封装值而不是返回引用,但这似乎并不值得。
您也可以将电话移至 statement.query_row进入条件 block :

if x {
statement.query_row(params![1, 2, 3]);
} else {
statement.query_row(params![4, 5]);
}
这将避免创建您不需要的参数对象。

关于rust - if else 借入时临时值(value)下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65886376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com