如果不使用返回值,`unwrap()`的目的是什么?

时间:2017-07-17 11:09:40

标签: error-handling rust stdin

我发现这个Rust代码用于从stdin获取一行:

use std::io;

fn main() {
    let mut line = String::new();
    io::stdin().read_line(&mut line).unwrap();
    println!("Input: {}", line);
}

io::stdin().read_line(&mut line)line变量设置为从stdin读取的行。根据我的理解,read_line()会返回Result值,可以进行模式匹配,如果.unwrap()不是Err,则可以使用read_line()来获取内部值。

但是,永远不会使用line的返回值。仅使用.unwrap()字符串变量,但人们大多数时间都使用unwrap(),即使它未被使用。

如果未使用返回值, .loader { border-right: 16px solid #00ccff; border-left: 16px solid #99ff00; border-radius: 50%; margin: 20% 45%; border-top: 16px solid #99ff00; border-bottom: 16px solid #00ccff; width: 120px; height: 120px; }的目的是什么?只是抛出一个错误?

2 个答案:

答案 0 :(得分:10)

  

如果未使用返回值,[('Tropical Disco fueled by Chandon Passion', 'SAT, 22 Jul 2017'), ('West House Crossover Connection VOL.5 -Zakuro 1st Anniversary', 'SAT, 22 Jul 2017'), ('SUBCULTURE', 'SAT, 22 Jul 2017')] 的目的是什么?只是抛出一个错误?

是的,但并非全部

忽视潜在错误很糟糕;空D:\Parth\userprofiles>npm install oracledb --save > oracledb@1.13.1 install D:\Parth\userprofiles\node_modules\oracledb > node-gyp rebuild D:\Parth\userprofiles\node_modules\oracledb>if not defined npm_config_node_gyp ( node "C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modu les\node-gyp\bin\node-gyp.js" rebuild ) else (node "" rebuild ) Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch. TRACKER : error TRK0005: Failed to locate: "CL.exe". The system cannot find the file specified. [D:\Parth\userprofiles\node_modules\oracledb\build\oracledb.vc xproj] gyp ERR! build error gyp ERR! stack Error: `C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe` fail ed with exit code: 1 gyp ERR! stack at ChildProcess.onExit (C:\Program Files\nodejs\node_modules\ npm\node_modules\node-gyp\lib\build.js:276:23) gyp ERR! stack at emitTwo (events.js:106:13) gyp ERR! stack at ChildProcess.emit (events.js:191:7) gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_proces s.js:215:12) gyp ERR! System Windows_NT 6.1.7601 gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodej s\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" gyp ERR! cwd D:\Parth\userprofiles\node_modules\oracledb gyp ERR! node -v v6.11.0 gyp ERR! node-gyp -v v3.4.0 gyp ERR! not ok npm WARN userprofiles@1.0.0 No repository field. npm ERR! Windows_NT 6.1.7601 npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\ node_modules\\npm\\bin\\npm-cli.js" "install" "oracledb" "--save" npm ERR! node v6.11.0 npm ERR! npm v3.10.10 npm ERR! code ELIFECYCLE npm ERR! oracledb@1.13.1 install: `node-gyp rebuild` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the oracledb@1.13.1 install script 'node-gyp rebuild'. npm ERR! Make sure you have the latest version of node.js and npm installed. npm ERR! If you do, this is most likely a problem with the oracledb package, npm ERR! not with npm itself. npm ERR! Tell the author that this fails on your system: npm ERR! node-gyp rebuild npm ERR! You can get information on how to open an issue for this project with: npm ERR! npm bugs oracledb npm ERR! Or if that isn't available, you can get their info via: npm ERR! npm owner ls oracledb unwrap()之间由于错误而未被阅读,因此存在很大差异;例如,在典型的"管道中#34;命令在shell中,程序需要在停止接收输入时停止,否则用户必须将其删除。

在C中,忽略错误太容易了。许多语言通过例外来解决这个问题,但Rust没有。

为了避免困扰C程序的问题,它很容易忘记检查返回代码,通常Rust函数会在line中捆绑预期的返回值和错误,这样你< em>有来检查它以获得返回值。

但是还有一个潜在的问题:如果来电者不关心返回值怎么办?最值得注意的是,当值为line时,没有人真正关心它。

这里调用了一些编译器魔法:Result结构标有()属性。此属性使必须在Result 返回时执行某些操作。

因此,在你的情况下,不仅是打包好,它也是做某事的最简单的方法&#34;并避免编译警告。

答案 1 :(得分:2)

如果你不想优雅地&#34;处理无法从标准输入读取一行的情况(例如,通过再次尝试或选择默认值),您可以使用unwrap()来触发恐慌;它使由Result未使用的警告静音:

warning: unused result which must be used
 --> src/main.rs:5:5
  |
5 |     io::stdin().read_line(&mut line);
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(unused_must_use)] on by default