首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锈蚀&str转换为&‘静态&str

锈蚀&str转换为&‘静态&str
EN

Stack Overflow用户
提问于 2019-12-12 12:18:49
回答 1查看 1.6K关注 0票数 1

我正在接收来自应用程序的args的&str,但我需要这个值作为&'static &str。我怎样才能把它转换?

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

代码语言:javascript
复制
fn fun(var: &'static &str) {}

fn main() {
    let var: &str = "temp";
    fun(var);
}
代码语言:javascript
复制
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

@更多信息

代码语言:javascript
复制
.
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── main.rs
│   └── server.rs
代码语言:javascript
复制
// 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(),
    );
代码语言:javascript
复制
// 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()

EN

回答 1

Stack Overflow用户

发布于 2019-12-17 22:31:57

当编译器说您需要&'static时,这并不是真正的意思。它试图告诉您,这里不允许临时引用()。

&'static str是一个特例,基本上是内存泄漏。在99.99%的情况下,泄漏内存是个坏主意,所以编译器的建议是愚蠢的。不要尝试使用&'static str。使用一个拥有的String代替。

请记住,&str本身不是一个字符串,而是存储在其他地方的一些字符串的只读视图。

因此,真正的问题是,您使用了临时&str,而应该使用永久存储的String

但是在0.01%的情况下,您可以泄漏字符串的内存,下面是如何:

代码语言:javascript
复制
let leaked: &'static str = Box::leak("hi".to_string().into_boxed_str());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59304434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档