Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Static 创建静态常量时出现内部编译器错误_Static_Rust - Fatal编程技术网

Static 创建静态常量时出现内部编译器错误

Static 创建静态常量时出现内部编译器错误,static,rust,Static,Rust,我试图通过匹配env::home\u dir创建静态或常量: static home: String = match env::home_dir() { Some(ref p) => p.to_str().unwrap().to_owned(), None => "./".to_string(), }; 但我遇到了一个编译器错误: src/main.rs:15:8: 15:13 error: internal compiler error: no enclosing

我试图通过匹配env::home\u dir创建静态或常量:

static home: String = match env::home_dir() {
    Some(ref p) => p.to_str().unwrap().to_owned(),
    None => "./".to_string(),
};
但我遇到了一个编译器错误:

src/main.rs:15:8: 15:13 error: internal compiler error: no enclosing scope found for scope: CodeExtent(346/Misc(20))
src/main.rs:15          Some(ref p) => p.to_str().unwrap().to_owned(),
                             ^~~~~
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
note: run with `RUST_BACKTRACE=1` for a backtrace
thread 'rustc' panicked at 'Box<Any>', ../src/libsyntax/diagnostic.rs:175
src/main.rs:15:8:15:13错误:内部编译器错误:找不到作用域的封闭作用域:CodeExtent(346/Misc(20))
src/main.rs:15 Some(ref p)=>p.to_str().unwrap().to_owned(),
^~~~~
注意:编译器出人意料地惊慌失措。这是一个错误。
注意:如果您能提供错误报告,我们将不胜感激:https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-报告
注意:使用'RUST_BACKTRACE=1'运行回溯跟踪
线程'rustc'在'Box'处惊慌失措,../src/libsyntax/diagnostic.rs:175
这是我的代码中的一个bug还是我应该报告这个bug?是否可以将
home
作为常量或静态值获取

我需要多次使用它来为一些文件操作添加一些文件名,我希望它们都在同一个文件夹中

这是我代码中的错误吗

你的代码有一些不合理的地方,所以我想这是一个bug

我应该报告这个错误吗

可能吧。编译器不应该崩溃,它应该很好地向用户报告错误。首先查看是否存在缺陷,如果存在,请对其进行评论

是否可以将
home
作为常量或静态值获取

不完全是。在程序的整个过程中,需要使用常量值。这意味着它们存在于
main
启动之前和
main
退出之后。对
env::home\u dir()
的调用不可能满足该确切标准

最直接的方法是获取一次值,然后将其传递到需要的地方。这样可以避免多次获取该值:

fn main() {
    let home = env::home_dir();
    let home = home.as_ref().map(|d| d.as_path()).unwrap_or(Path::new("./"));

    function_1(&home);
    function_2(&home);
    function_3(&home);
}
您还可以将其作为
&Path
PathBuf
放置到结构中:

struct Thing {
    home: PathBuf,
}

fn main() {
    let home = env::home_dir().unwrap_or_else(|| PathBuf::from("./"));
    let t = Thing { home: home };

    t.function_1();
    t.function_2();
    t.function_3();
}
这可能就是我要做的。没有理由像静态值那样永远保持内存分配

我需要多次使用它来为一些文件操作添加一些文件名,我希望它们都在同一个文件夹中

没有什么可以阻止您简单地创建一个函数来放置逻辑:

fn safe_home_dir() -> PathBuf {
    env::home_dir().unwrap_or_else(|| PathBuf::from("./"))
} 
然后只需多次调用该函数。你可以分析一下它有多贵,但我的直觉是这里不会有明显的缓慢


如果您确实需要它是静态的,那么您可以使用。

答案 静态变量不能有逻辑,要做到这一点,您必须使用
lazy\u Static
板条箱,它使您能够执行逻辑。一张小纸条,为了访问可验证文件,你必须遵守它。所以
println!(“{}”,家)不起作用,但是
println!(“{},*家)可以

解决方案
恐怕Rust“在主代码之前没有生命”的原因是(1)静态初始化顺序失败(C++中的一个众所周知的问题)和(2)启动性能(很容易意外地用大量的预主代码将二进制文件弄乱)。谢谢,这是行得通的),但是如何处理编译器错误呢?@IvanTemchenko转到repo,并提出一个问题。提供导致编译器错误的代码片段,以及您的rust版本。您可以通过键入命令
rustc-vV
找到您的rust版本。
#[macro_use]
extern crate lazy_static;
use std::env;
lazy_static! {
    static ref HOME: String = {
        match env::home_dir() {
            Some(p) => p.to_str().unwrap().to_owned(),
            None => "./".to_string(),
        }
    };
}

fn main() {
    println!("{:?}", *HOME);
}