Pointers 生活在锈迹斑斑的生活中

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

我实际上在尝试用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 = 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(…)代码的实际功能。我从某个网站复制并粘贴了它,没有理解,所以非常感谢!