rust - 'let' 的范围与阴影和字符串 -> &str 转换
问题描述
使用以下代码,我尝试返回用户输入的温度 &str,但没有成功。然后,我试图返回 f32,但仍然很挣扎......
Q1。我在底部收到错误的原因是因为' let temp = String::new();
'的范围仍然存在,即使我稍后let temp = temp.trim().parse::<f32>();
在循环中通过'''遮蔽'它?
Q2。如何重写代码以使其返回 &str?
fn gettemp() -> f32 {
let temp = String::new();
loop {
println!("What is your temperature?");
io::stdin().read_line(&mut temp).expect("Failed to read the line");
let temp = temp.trim().parse::<f32>();
if !temp.is_ok() {
println!("Not a number!");
} else {
break;
}
}
temp
}
错误:
error[E0308]: mismatched types
--> src/main.rs:70:5
|
49 | fn gettemp() -> f32 {
| --- expected `f32` because of return type
...
70 | temp
| ^^^^ expected f32, found struct `std::string::String`
|
= note: expected type `f32`
found type `std::string::String`
解决方案
关于问题 1,您可以break
使用一个值退出循环:
fn gettemp() -> f32 {
let mut temp = String::new();
loop {
println!("What is your temperature?");
io::stdin().read_line(&mut temp).expect("Failed to read the line");
let temp = temp.trim().parse::<f32>();
if !temp.is_ok() {
println!("Not a number!");
} else {
break temp.unwrap() // yield value when breaking out of loop
}
}
}
这样,整个循环的值就是你传递的东西break
。
关于问题2,我不确定您是否真的要这样做,因为&str
是借来的类型。我认为你想String
在这种情况下返回一个拥有数据的。
推荐阅读
- node.js - AWS @aws-sdk/lib-dynamodb '无法读取未定义的属性'0''
- python - 不使用 BuildKit 时 Docker 'Permission denied'
- java - 如何使用 WindowEvent 终止这个示例 Swing 应用程序?
- python - 我有这些词典。我应该使用什么命令来打印第二个中的“d”键?有个窍门
- reactjs - 如何在 React js 上删除满足特定条件的列表元素
- testing - 是否可以在 testcafe-browser-provider-saucelabs 中添加 iPad 参数“deviceOrientation”?
- c# - 如何以编程方式从动态 JObject 中删除属性
- c# - 实体框架 - SaveChanges 与事务
- php - 如何过滤 wordpress the_date() 和 get_the_date() 函数以仅显示帖子发布的年份
- .net-core - Abp中如何使用EfCore Code First将实体中的注解生成到数据库的字段描述中