作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我对Rust还是很陌生,并且一直在与所有权机制进行斗争。 我想遍历本地目录并将所有单个元素收集到一个结构中。然后将这些结构放入向量中以备后用。因此,基本上我正在尝试构建结构的向量。 结构的前两个字段应
我是一名优秀的程序员,十分优秀!