gpt4 book ai didi

rust - 动态生成具有拍手格式说明的子命令

转载 作者:行者123 更新时间:2023-12-03 11:38:49 25 4
gpt4 key购买 nike

我想基于clap内容为HashMap生成子命令。为此,我要遍历所有项以创建新的App实例。问题在于App.about()需要&str作为输入,而我无法从format!()宏中创建一个生命周期足够长的代码。
这是一个示例(playground):

use clap::App;
use std::collections::HashMap;

fn main() {
let mut map = HashMap::new();
map.insert("key", "value");
map.insert("key2", "value2");
map.insert("key3", "value3");

let mut app = App::new("Test").version("1.0");

for (key, value) in map.iter() {
let about = format!("Value: {}", value);
app = app.subcommand(App::new(*key)).about(about.as_str());
}

app.get_matches();
}
错误信息:
error[E0597]: `about` does not live long enough
--> src/main.rs:14:52
|
14 | app = app.subcommand(App::new(*key)).about(about.as_str());
| ^^^^^ borrowed value does not live long enough
15 | }
| - `about` dropped here while still borrowed
16 |
17 | app.get_matches();
| --- borrow later used here
如何将格式化的字符串传递给 about()方法?

最佳答案

首先,您似乎有一个不相关的错误,为了减少对代码样本正确性的混淆,我将提及该错误。我自己没有使用过clap,但看起来这是在反复覆盖应用程序的about

app = app.subcommand(App::new(*key)).about(about.as_str());
你可能是说
app = app.subcommand(App::new(*key).about(about.as_str()));
而是将其应用于子命令。

这里的问题是 App不想拥有字符串,因此需要另一个对象。一种方法是构造一个包含 format! ted字符串(并因此拥有它们)的映射:
    let abouts: HashMap<String, String> = map.iter()
.map(|(key, value)| (key.to_string(), format!("Value: {}", value)))
.collect();
for (key, about) in abouts.iter() {
app = app.subcommand(App::new(key.as_str()).about(about.as_str()));
}
映射 abouts必须与 app一样长。
如果只在程序中执行一次此操作,则可以泄漏分配的内存 format!:
    for (key, value) in map.iter() {
let about = &*Box::leak(format!("Value: {}", value).into_boxed_str());
app = app.subcommand(App::new(*key).about(about));
}
如果您希望能够回收内存,但又不想处理上面的 abouts这样的结构,则由于实际问题更加复杂,可以使用 typed_arena crate 提供分配任意数量的内存的位置。字符串并保持它们全部 Activity :
use typed_arena::Arena;

...

let arena = Arena::new();
for (key, value) in map.iter() {
let about = arena.alloc(format!("Value: {}", value)).as_str();
app = app.subcommand(App::new(*key).about(about));
}
abouts解决方案一样,只要保持 arena不变,就需要保持 app不变。

关于rust - 动态生成具有拍手格式说明的子命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64184984/

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