Pointers 生活在锈迹斑斑的生活中
我实际上在尝试用rust编写一个简单的命令行程序。它应该查找命令行参数,如果没有,它应该要求用户输入所需的参数。这是我的密码:Pointers 生活在锈迹斑斑的生活中,pointers,rust,lifetime,Pointers,Rust,Lifetime,我实际上在尝试用rust编写一个简单的命令行程序。它应该查找命令行参数,如果没有,它应该要求用户输入所需的参数。这是我的密码: fn main() { let mut reader = io::stdin(); let args = os::args(); let mut input: &str; if args.len() < 2 { println!("Please enter a number:"); input
fn main() {
let mut reader = io::stdin();
let args = os::args();
let mut input: &str;
if args.len() < 2 {
println!("Please enter a number:");
input = reader.read_line().ok().expect("Failed to read line").as_slice().trim();
} else {
input = args.get(1).as_slice();
}
let opt: Option<int> = from_str(input);
let num: int = match opt{
Some(number) => number,
None => 1
};
}
fn main(){
让mut reader=io::stdin();
设args=os::args();
让mut输入:&str;
如果args.len()小于2{
println!(“请输入一个数字:”);
输入=reader.read_line().ok().expect(“读取行失败”).as_slice().trim();
}否则{
input=args.get(1).as_slice();
}
让opt:Option=from_str(输入);
让num:int=match opt{
一些(数字)=>数字,
无=>1
};
}
我知道read_line()的结果只有调用它的块的生存期,因此程序不会编译。但我看不到任何其他方法来处理这个问题
Rust是我的第一种系统编程语言,我想我仍然没有真正理解指针,特别是~
和&
之间的区别,因此可能有一种使用指针的解决方案,我没有看到,因为我对指针缺乏理解
谢谢你的帮助
Jonas在您的情况下,问题来自这样一个事实:您在
输入中存储的是&str
,也就是说,一个片段到一个字符串
在Rust中,切片是以类似数组的方式查看某个内容(数组、向量、字符串…)的视图,实际上是对第一个知道数据长度的元素的引用,但它不拥有任何内容
当您了解底层的字符串
在块的末尾被销毁时,您的输入将引用已释放的内存,这是Rust不允许的。您需要数据的一个副本,因为您无法获得它的所有权,因为您对它进行了处理
您可以让您的输入
类型为字符串
,而不是&str
,这样它将拥有自己的数据。您需要进行一些更改,如:
input = String::from_str(/* your old code */);
及
let opt:Option=from_str(input.as_slice());
在您的情况下,问题来自这样一个事实:您在输入中存储的是&str
,也就是说,一个片段到一个字符串
在Rust中,切片是以类似数组的方式查看某个内容(数组、向量、字符串…)的视图,实际上是对第一个知道数据长度的元素的引用,但它不拥有任何内容
当您了解底层的字符串
在块的末尾被销毁时,您的输入将引用已释放的内存,这是Rust不允许的。您需要数据的一个副本,因为您无法获得它的所有权,因为您对它进行了处理
您可以让您的输入
类型为字符串
,而不是&str
,这样它将拥有自己的数据。您需要进行一些更改,如:
input = String::from_str(/* your old code */);
及
let opt:Option=from_str(input.as_slice());
免责声明:我也是一名新手,到目前为止,我只玩了两周的铁锈游戏
使用另一个字符串
缓冲区
通过将短寿命的字符串
移动到另一个寿命更长的mut字符串
,可以有效延长其寿命:
use std::{io, os};
fn main() {
let mut reader = io::stdin();
let args = os::args();
let mut save : String;
let input: &str = if args.len() < 2 {
println!("Please enter a number:");
save = reader.read_line().ok().expect("Failed to read line");
save.as_slice().trim()
} else {
args[1].as_slice()
};
let opt: Option<int> = from_str(input);
let num: int = match opt{
Some(number) => number,
None => 1
};
println!("num=={}", num);
}
我觉得args[1].clone()
有点违反直觉,而args[1]
的类型是String
。但否则,我们最终会将字符串
移出不可变的字符串
向量参数
注意.ok()。除(…)
您可能会发现unwrap()
方法对于小程序来说很方便
免责声明:我也是一名菜鸟,到目前为止,我只和Rust玩了两周
使用另一个
字符串
缓冲区
通过将短寿命的字符串
移动到另一个寿命更长的mut字符串
,可以有效延长其寿命:
use std::{io, os};
fn main() {
let mut reader = io::stdin();
let args = os::args();
let mut save : String;
let input: &str = if args.len() < 2 {
println!("Please enter a number:");
save = reader.read_line().ok().expect("Failed to read line");
save.as_slice().trim()
} else {
args[1].as_slice()
};
let opt: Option<int> = from_str(input);
let num: int = match opt{
Some(number) => number,
None => 1
};
println!("num=={}", num);
}
我觉得args[1].clone()
有点违反直觉,而args[1]
的类型是String
。但否则,我们最终会将字符串
移出不可变的字符串
向量参数
注意.ok()。除(…)
您可能会发现unwrap()
方法对于小程序来说很方便
感谢您使用if展示了一些syntactic sugar,并让我思考和了解我的ok().expect(…)代码的实际功能。我从某个网站复制并粘贴了它,没有理解,所以非常感谢!感谢您使用if展示了一些syntactic sugar,并让我思考和了解我的ok().expect(…)代码的实际功能。我从某个网站复制并粘贴了它,没有理解,所以非常感谢!