在来自 os::args 的字符串上调用 from_str 时类型不匹配
Mismatched types when calling from_str on a String from os::args
我正在 http://aml3.github.io/RustTutorial/html/01.html 学习 Rust 教程,目前我正在处理 Collatz 问题。当我尝试编译此代码时,出现以下错误:
main.rs:9:26: 9:39 error: mismatched types: expected `&str`, found `collections::string::String` (expected &-ptr, found struct collections::string::String)
main.rs:9 let i = from_str::<int>(os::args()[1]).unwrap();
因此,我试图将命令行输入的字符串转换为 int
,但命令行输入的是 &str
?这里有什么不匹配?
use std::os;
fn main() {
if os::args().len() < 2 {
println!("Error: Please provide a number as argument.");
return;
}
let i = from_str::<int>(os::args()[1]).unwrap();
println!("{:d} has {:d} Collatz steps", i, collatz(i));
}
fn collatz(N: int) -> int {
if N == 1 { return 0; }
match N % 2 {
0 => { 1 + collatz(N/2) }
_ => { 1 + collatz(N*3+1) }
}
}
该教程指出:
Spring 2014
这在 Rust-land 是个坏消息。直到最近,该语言还在经历许多结构性变化。然而,自 1.0.0 测试版以来,该语言已大大稳定。
所以,这里是固定的例子:
use std::env; // env, not os
fn main() {
// args is an iterator now
let args: Vec<_> = env::args().collect();
if args.len() < 2 {
println!("Error: Please provide a number as argument.");
return;
}
// int doesn't exist anymore, from_str is better as `parse`
let i: i32 = args[1].parse().unwrap();
// No more `d` specifier
println!("{} has {} Collatz steps", i, collatz(i));
}
// variables should be snake_case
fn collatz(n: i32) -> i32 {
if n == 1 { return 0; }
match n % 2 {
0 => { 1 + collatz(n/2) }
_ => { 1 + collatz(n*3+1) }
}
}
我建议
- 不再使用该教程
- 联系作者并要求他们标明它使用的 Rust 版本
- 修改示例并提交回去
我正在 http://aml3.github.io/RustTutorial/html/01.html 学习 Rust 教程,目前我正在处理 Collatz 问题。当我尝试编译此代码时,出现以下错误:
main.rs:9:26: 9:39 error: mismatched types: expected `&str`, found `collections::string::String` (expected &-ptr, found struct collections::string::String)
main.rs:9 let i = from_str::<int>(os::args()[1]).unwrap();
因此,我试图将命令行输入的字符串转换为 int
,但命令行输入的是 &str
?这里有什么不匹配?
use std::os;
fn main() {
if os::args().len() < 2 {
println!("Error: Please provide a number as argument.");
return;
}
let i = from_str::<int>(os::args()[1]).unwrap();
println!("{:d} has {:d} Collatz steps", i, collatz(i));
}
fn collatz(N: int) -> int {
if N == 1 { return 0; }
match N % 2 {
0 => { 1 + collatz(N/2) }
_ => { 1 + collatz(N*3+1) }
}
}
该教程指出:
Spring 2014
这在 Rust-land 是个坏消息。直到最近,该语言还在经历许多结构性变化。然而,自 1.0.0 测试版以来,该语言已大大稳定。
所以,这里是固定的例子:
use std::env; // env, not os
fn main() {
// args is an iterator now
let args: Vec<_> = env::args().collect();
if args.len() < 2 {
println!("Error: Please provide a number as argument.");
return;
}
// int doesn't exist anymore, from_str is better as `parse`
let i: i32 = args[1].parse().unwrap();
// No more `d` specifier
println!("{} has {} Collatz steps", i, collatz(i));
}
// variables should be snake_case
fn collatz(n: i32) -> i32 {
if n == 1 { return 0; }
match n % 2 {
0 => { 1 + collatz(n/2) }
_ => { 1 + collatz(n*3+1) }
}
}
我建议
- 不再使用该教程
- 联系作者并要求他们标明它使用的 Rust 版本
- 修改示例并提交回去