Rust&str转换为&'static&str

时间:2019-12-12 12:18:49

标签: rust type-conversion

我从应用程序的参数中收到一个&str,但是我需要将此值作为&'static &str。 我该如何转换?

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=7ab020528a0d3e26a49b915542f50c8e

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()

1 个答案:

答案 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());