types - 如何修复“隐式返回'()',因为它的主体没有尾巴或'return'表达式?
问题描述
Rust 和编程新手。我正在尝试编写一个程序来计算用户输入的项目的州销售税。在一些帮助下,我想我已经接近尾声了,但是我有一个我不明白的错误:
4 fn read_one() -> String { 预期的 struct 'st::string::String', found () 隐式返回 '()' 因为它的主体没有尾部或 'return' 表达式
代码如下:
use::std::io;
use::std::collections::HashMap;
fn read_one() -> String {
let mut words = String::new();
io::stdin().read_line(&mut words)
.ok()
.expect("Failed to read line.");
}
fn main() {
let mut tax_rates = HashMap::new();
tax_rates.insert("AL".to_string(), 0.04);
tax_rates.insert("AK".to_string(), 0.00);
tax_rates.insert("AZ".to_string(), 0.056);
tax_rates.insert("AR".to_string(), 0.65);
tax_rates.insert("CA".to_string(), 0.725);
tax_rates.insert("CO".to_string(), 0.029);
tax_rates.insert("CT".to_string(), 0.635);
tax_rates.insert("DE".to_string(), 0.00);
tax_rates.insert("DC".to_string(), 0.06);
tax_rates.insert("FL".to_string(), 0.06);
tax_rates.insert("GA".to_string(), 0.04);
tax_rates.insert("HI".to_string(), 0.04);
tax_rates.insert("ID".to_string(), 0.06);
tax_rates.insert("IL".to_string(), 0.0625);
tax_rates.insert("IN".to_string(), 0.07);
tax_rates.insert("IA".to_string(), 0.06);
tax_rates.insert("KS".to_string(), 0.065);
tax_rates.insert("KY".to_string(), 0.06);
tax_rates.insert("LA".to_string(), 0.0445);
tax_rates.insert("ME".to_string(), 0.055);
tax_rates.insert("MD".to_string(), 0.06);
tax_rates.insert("MA".to_string(), 0.0625);
tax_rates.insert("MI".to_string(), 0.06);
tax_rates.insert("MN".to_string(), 0.06875);
tax_rates.insert("MS".to_string(), 0.07);
tax_rates.insert("MO".to_string(), 0.0425);
tax_rates.insert("MT".to_string(), 0.00);
tax_rates.insert("NE".to_string(), 0.055);
tax_rates.insert("NV".to_string(), 0.0685);
tax_rates.insert("NH".to_string(), 0.00);
tax_rates.insert("NJ".to_string(), 0.06625);
tax_rates.insert("NM".to_string(), 0.05125);
tax_rates.insert("NY".to_string(), 0.04);
tax_rates.insert("NC".to_string(), 0.0475);
tax_rates.insert("ND".to_string(), 0.05);
tax_rates.insert("OH".to_string(), 0.0575);
tax_rates.insert("OK".to_string(), 0.045);
tax_rates.insert("OR".to_string(), 0.00);
tax_rates.insert("PA".to_string(), 0.06);
tax_rates.insert("RI".to_string(), 0.07);
tax_rates.insert("PR".to_string(), 0.115);
tax_rates.insert("SC".to_string(), 0.06);
tax_rates.insert("SD".to_string(), 0.045);
tax_rates.insert("TN".to_string(), 0.07);
tax_rates.insert("TX".to_string(), 0.0625);
tax_rates.insert("UT".to_string(), 0.0485);
tax_rates.insert("VA".to_string(), 0.043);
tax_rates.insert("VT".to_string(), 0.06);
tax_rates.insert("WA".to_string(), 0.065);
tax_rates.insert("WV".to_string(), 0.06);
tax_rates.insert("WI".to_string(), 0.05);
tax_rates.insert("WY".to_string(), 0.04);
println!("In what state are you making your purchase?");
let state = read_one();
let state = state.trim().to_uppercase();
println!("How many items are you purchasing?");
let mut purchase_number = read_one();
let mut purchase_number = purchase_number.trim().parse::<i32>().unwrap();
match tax_rates.get(&state) {
Some(rate) => {
println!("The tax rate for {} is ({}).", state, rate);
}
None => {
println!("None.");
}
}
let mut tax_vec = Vec::new();
let mut cost_vec = Vec::new();
for item_number in 0..purchase_number {
println!("What is the cost of item number {}?", item_number);
let item_cost = read_one();
let item_cost = item_cost.trim().parse::<f64>().unwrap();
match tax_rates.get(&state) {
Some(rate) => {
let tax_amount = item_cost * rate;
let fin_cost = item_cost + tax_amount;
println!("The tax amount for item {} is: {:.2}",
item_number, tax_amount);
println!("The final cost of item number {} is: {:.2}",
item_number, fin_cost);
tax_vec.push(tax_amount);
cost_vec.push(fin_cost);
}
None => {
println!("None.");
}
}
}
println!("{:?}", tax_vec);
println!("{:?}", cost_vec);
}
解决方案
要从函数返回一个值,在 rust 中有两个选项:
- 使用
return <some value>;
表达式 - 以表达式或不带分号的值结束函数
// returns the value '1' of type 'u8' without using a 'return'
fn return_one() -> u8 {
1
}
当这些选项都没有使用时,即功能块以分号结尾,就像你的函数一样,那么返回的值就是()
单位类型。这个值也从没有声明像这样的返回类型的函数返回:
// This function returns the unit type '()',
// because it ends with a semicolon and has no return expressions.
fn print_to_console(message: &str) {
println!(message);
}
推荐阅读
- c# - 如何让一个物体在被玩家击中后移动到某个位置?
- c++ - 这是使用 decltype 在 C++ 中推断返回类型的尾函数的虚函数的签名
- java - Spring Batch 从同一个表和多线程设置读取和更新?
- reactjs - 我应该如何在 Menu 组件的 Material UI 中使用 transformOrigin
- python - 通过从另一个数据框中选择来在一个数据框中创建一个新列
- java - Java 在评估语句时如何处理变量?
- kubernetes - helm Prometheus values.yaml 的 alertmanager.yml 部分中的 external_labels 配置出错
- next.js - 如何在生产模式(和 Vercel)中显示从 Next.js 中的 getStatic 函数生成的日志?
- matlab - 运行仿真时出错,仿真终止
- javascript - 每个绘图圈的随机数