我正在接收来自应用程序的args的&str,但我需要这个值作为&'static &str。我怎样才能把它转换?
fn fun(var: &'static &str) {}
fn main() {
let var: &str = "temp";
fun(var);
}error[E0308]: mismatched types
--> src/main.rs:102:9
|
102 | matches.value_of("STATIC-FILES").unwrap(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected &str, found str
|
= note: expected type `&'static &str`
found type `&str`
error: aborting due to previous error@更多信息
.
├── Cargo.lock
├── Cargo.toml
├── src
│ ├── main.rs
│ └── server.rs// file: main.rs
extern crate clap;
use clap::{App, Arg};
mod server;
fn main() {
let app = App::new("My App")
.arg(
Arg::with_name("STATIC-FILES")
.help("Sets absolute path to client's static files")
.default_value("/var/www/client"),
)
let matches = app.get_matches();
let s = server::start(
matches.value_of("STATIC-FILES").unwrap(),
);// file: server.rs
use actix_files as fs;
use actix_web::{guard, web, App, HttpResponse, HttpServer};
pub fn start(
static_files_path: &'static &str,
) -> io::Result<()> {
let sys = actix_rt::System::new("myappsvr");
HttpServer::new(move || {
let sfp = move || static_files_path;
App::new()
.service(fs::Files::new("/", sfp()).index_file("index.html"))
})
(...)
.start();
sys.run();
}在main.rs中,我正在启动一个HTTP (Actix)。带有静态文件的目录的路径必须作为参数传递。
App::new().service(fs::Files::new("/", sfp()).index_file("index.html"))需要&'static &str而不是sfp()。
发布于 2019-12-17 22:31:57
当编译器说您需要&'static时,这并不是真正的意思。它试图告诉您,这里不允许临时引用()。
&'static str是一个特例,基本上是内存泄漏。在99.99%的情况下,泄漏内存是个坏主意,所以编译器的建议是愚蠢的。不要尝试使用&'static str。使用一个拥有的String代替。
请记住,&str本身不是一个字符串,而是存储在其他地方的一些字符串的只读视图。
因此,真正的问题是,您使用了临时&str,而应该使用永久存储的String。
但是在0.01%的情况下,您可以泄漏字符串的内存,下面是如何:
let leaked: &'static str = Box::leak("hi".to_string().into_boxed_str());https://stackoverflow.com/questions/59304434
复制相似问题