const FILENAME:&str="test.txt"; std::fs::File::open(FILENAME).expect("打开文件 test.txt 时出错");
我想将上面括号中的 test.txt 用常量 FILENAME替换所以这样
std::fs::File::open(FILENAME).expect(format!("打开文件 {} 时出错",FILENAME));
但这样不行,因为 format! 宏返回 String.
只能这样
std::fs::File::open(FILENAME).expect(&format!("打开文件时 {}发生错误",FILENAME)[..]);
这种易用性,真的可以吐槽一年。。。。
1
共 8 条评论, 1 页
评论区
写评论========你怀疑易用性是因为还没看完教程========
std::fs::File::open(FILENAME).expect(&format!("打开文件 {} 时发生错误", FILENAME));
遇事还是要多看看标准库文档
std::fs::File::open(FILENAME).expect(&format!("打开文件时 {}发生错误",FILENAME)[..]);
就如同 kuviki 所说,你这里加上"
[..]
"是多余的,你做了编译器可以自动帮你完成的事。expect需要的是
&str
参数,因为String实现了Deref trait
, 那么这里的&String
就是让编译器自动的进行隐式解引用强制多态,转换为(&String).deref()
调用,结果就是&str
.如果觉得这样太耗费心智,可以像
C++
的std::string
转换为const char*
调用c_str()
一样, 还可以改成:std::fs::File::open(FILENAME).expect(format!("打开文件时 {}发生错误",FILENAME).as_str());
c++ 是 sprintf 或者 cout,也都要手动管理内存。 java/go 这些有 gc 的语言本来就不一样。
对以下内容的回复:
std::fs::File::open(FILENAME).expect(&format!("打开文件时 {}发生错误", FILENAME));
“[..]”是多余的
老哥,C++ 异常抛出一个
std::string
对象.c_str()
出的const char*
以后也得炸,不要把过去c/c++的编码习惯当成是rust的编码习惯,这点很重要!
根据Clippy的提示,应该这样写
std::fs::File::open(FILENAME).unwrap_or_else(|_| panic!("打开文件 {} 时出错", FILENAME));
在其它语言中,用一个占位符替换后返回一个字符串,是再正常不过的一件事,在RUST中搞得如此复杂 。。