我从应用程序的参数中收到一个&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
代替spf()
。
答案 0 :(得分:0)
当编译器说您需要&'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());