< 返回版块

FreeWong 发表于 2019-09-19 21:39

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)[..]);

这种易用性,真的可以吐槽一年。。。。

评论区

写评论
Nugine 2019-09-22 17:58

========你怀疑易用性是因为还没看完教程========

std::fs::File::open(FILENAME).expect(&format!("打开文件 {} 时发生错误", FILENAME));

spqchk 2019-09-22 15:43

遇事还是要多看看标准库文档

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

Ryan-Git 2019-09-22 14:23

c++ 是 sprintf 或者 cout,也都要手动管理内存。 java/go 这些有 gc 的语言本来就不一样。

对以下内容的回复:

kuviki 2019-09-20 00:33

std::fs::File::open(FILENAME).expect(&format!("打开文件时 {}发生错误", FILENAME));

“[..]”是多余的

chirsz-ever 2019-09-19 22:45

老哥,C++ 异常抛出一个 std::string 对象 .c_str() 出的 const char* 以后也得炸,

lygz5016 2019-09-19 22:22

不要把过去c/c++的编码习惯当成是rust的编码习惯,这点很重要!

songzhi 2019-09-19 22:03

根据Clippy的提示,应该这样写 std::fs::File::open(FILENAME).unwrap_or_else(|_| panic!("打开文件 {} 时出错", FILENAME));

作者 FreeWong 2019-09-19 21:43

在其它语言中,用一个占位符替换后返回一个字符串,是再正常不过的一件事,在RUST中搞得如此复杂 。。

1 共 8 条评论, 1 页