有没有办法将String(函数参数(转换为&str(用于返回值(,同时避免借用问题或引用临时值。
下面是一个示例用例:
PS:我被现有函数约束为这些类型,不能只更改函数参数的类型,也不能更改其&str消耗返回值。以下示例还使用clap::Arg::new来强调这一方面
// f is any iterator over String values, for example sake I am using Vec<String> with literal value which does not represent the real case.
let f: Vec<String> = vec!["A".into(),"B".into(),"C".into()].into_iter();
let arg: clap::Arg = f.map(|s: String|{
clap::Arg::new(s.as_str())
});
有没有办法将String(函数参数(转换为&str(用于返回值(,同时避免借用问题或引用临时值。
没有,但确实没有。
"否":如果您的参数是String
,则该函数拥有String
,这意味着一旦该函数退出,就会回收String
,因此任何对其的引用都将无效,因为它将处于悬空状态。
"但是"是":您可以将String
转换为Box<str>
,然后再将其转换成leak
。这将返回一个&'static str
,它将永远存在
"但是,实际上,没有":虽然就Rust而言,内存泄漏是安全的,但它仍然是内存泄漏。在某些情况下,这可能是好的(例如,在短期运行的过程中,明确释放是对资源的浪费,或者某些形式的临时实习(,但总的来说,这确实是一种糟糕的做法。