gpt4 book ai didi

rust - 使用rust lazy_static!具有后处理字符串的宏?

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

我正在尝试使用递归公用表表达式(大约80行SELECT语句)集成一个相当复杂的SQL查询。有两个不同的查询可以为递归设置种子。我不想在我的代码中嵌入两个不同的80行SQL语句,它们之间只有一行不同,谢谢,但是我也想避免每次使用时都重新计算这些表达式,因此lazy_static!include_str!似乎是一种解决方法。

lazy_static! {
static ref select_kasten_by_title_sql: &'static str = str::replace(
include_str!("sql/select_kasten_by_parameter.sql"),
"QUERYPARAMETER",
"zettlen.title"
)
.as_str();
}
除了我不断得到:
5 |        static ref select_kasten_by_title_sql: &'static str = str::replace(
| ___________________________________________________________^
| |___________________________________________________________|
| ||
26 | || include_str!("sql/select_kasten_by_parameter.sql"),
27 | || "QUERYPARAMETER",
28 | || "zettlen.title").as_str();
| ||________________________-________^ returns a value referencing data owned by the current function
| |_________________________|
| temporary value created here
这让我感到困惑,因为我无法确定它指的是什么功能。我得到一个临时值,但是它的生存期应该是该表达式的持续时间,不是吗,一旦将​​其设置为静态str,就可以了,对吧?

最佳答案

拆分变量可以使可视化变得更加容易:

lazy_static! {
static ref select_kasten_by_title_sql: &'static str = {
let tmp = str::replace(
include_str!("sql/select_kasten_by_parameter.sql"),
"QUERYPARAMETER",
"zettlen.title",
);
tmp.as_str()
};
}
tmp是块作用域拥有的局部变量。您正在尝试返回对 tmp的引用-您正在尝试返回一个引用当前作用域拥有的数据的值。这是不可能的,因为编译器会告诉您:
error[E0515]: cannot return value referencing local variable `tmp`
--> src/main.rs:11:5
|
11 | tmp.as_str()
| ---^^^^^^^^^
| |
| returns a value referencing data owned by the current function
| `tmp` is borrowed here
一个简单的解决方法是直接返回 String,而不是对其进行引用:
lazy_static! {
static ref select_kasten_by_title_sql: String = str::replace(
include_str!("sql/select_kasten_by_parameter.sql"),
"QUERYPARAMETER",
"zettlen.title"
);
}
如果您确实要返回 &'static str,则可以使用 Box::leak。我不建议您这样做,因为与 String相比,它没有任何好处,但是它是一个选择:
lazy_static! {
static ref T: &'static str = {
let tmp = str::replace(
include_str!("sql/select_kasten_by_parameter.sql"),
"QUERYPARAMETER",
"zettlen.title",
);
Box::leak(tmp.into_boxed_str())
};
}
``

关于rust - 使用rust lazy_static!具有后处理字符串的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64636650/

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