Static 创建静态常量时出现内部编译器错误
我试图通过匹配env::home\u dir创建静态或常量: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
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);
}