< 返回版块

WillJH 发表于 2020-08-31 05:02

use std::env;
use std::path::Path;

#[derive(Debug)]
pub enum Arg<'a> {
    Dir(&'a Path),
    File(&'a Path),
    Short(String),
    Full(String),
    Symbol(String),
}

#[derive(Debug)]
pub struct ArgsList<'a> {
    args: Vec<Arg<'a>>, 
}

impl<'a> ArgsList<'_>{
    pub fn new() -> Self {
        let mut args = Vec::new();
        let args_list: Vec<String> = env::args().collect();
        for i in &args_list[1..] {
            if i.starts_with("--") {
                args.push(Arg::Full(i.to_string()));
                continue;
            } else if i.starts_with("-") {
                args.push(Arg::Short(i.to_string()));
                continue;
            }

            let temp = Path::new(i);

            if temp.is_dir() {
                args.push(Arg::Dir(temp));
            } else if temp.is_file() {
                args.push(Arg::File(temp));
            }
        }

        ArgsList{args,}
    }
}

一直提示cannot return value referencing local variable args_list, 请问这里怎么改才能把Path 传出去?

评论区

写评论
作者 WillJH 2020-08-31 12:33

谢谢, 盖好了. Path::new()返回的就是 个引用. 欢乐PathBuf 总算能通过编译了

--
👇
jackalchenxu: 程序的意图:创建struct ArgsList对象实例, 里面的数据单元是pub enum Arg, Arg的单元类型是String或者&Path。

&Path不适合这种场合,把引用去掉(这样也不需要生命周期声明),另外使用PathBuf,而不是Path。

作者 WillJH 2020-08-31 12:20

--
👇
93996817: 都用String 试试;

use std::env;
use std::path::Path;

#[derive(Debug)]
pub enum Arg {
    Dir(String),
    File(String),
    Short(String),
    Full(String),
    Symbol(String),
}

#[derive(Debug)]
pub struct ArgsList  {
    args: Vec<Arg>, 
}

impl ArgsList{
    pub fn new() -> Self {
        let mut args = Vec::new();
        let args_list: Vec<String> = env::args().collect();
        for i in &args_list[1..] {
            if i.starts_with("--") {
                args.push(Arg::Full(i.to_string()));
                continue;
            } else if i.starts_with("-") {
                args.push(Arg::Short(i.to_string()));
                continue;
            }

            let temp = Path::new(i);

            if temp.is_dir() {
                args.push(Arg::Dir(String::from(i)));
            } else if temp.is_file() {
                args.push(Arg::File(String::from(i)));
            }
        }
        ArgsList{args,}
    }
}

都用String 是可以的. 但是我在外面引用时就得在创建Path 的对象了.所以想看看能不能有别的方法把Path也传出去

93996817 2020-08-31 10:59

都用String 试试;

use std::env;
use std::path::Path;

#[derive(Debug)]
pub enum Arg {
    Dir(String),
    File(String),
    Short(String),
    Full(String),
    Symbol(String),
}

#[derive(Debug)]
pub struct ArgsList  {
    args: Vec<Arg>, 
}

impl ArgsList{
    pub fn new() -> Self {
        let mut args = Vec::new();
        let args_list: Vec<String> = env::args().collect();
        for i in &args_list[1..] {
            if i.starts_with("--") {
                args.push(Arg::Full(i.to_string()));
                continue;
            } else if i.starts_with("-") {
                args.push(Arg::Short(i.to_string()));
                continue;
            }

            let temp = Path::new(i);

            if temp.is_dir() {
                args.push(Arg::Dir(String::from(i)));
            } else if temp.is_file() {
                args.push(Arg::File(String::from(i)));
            }
        }
        ArgsList{args,}
    }
}
jackalchenxu 2020-08-31 10:10

程序的意图:创建struct ArgsList对象实例, 里面的数据单元是pub enum Arg, Arg的单元类型是String或者&Path。

&Path不适合这种场合,把引用去掉(这样也不需要生命周期声明),另外使用PathBuf,而不是Path。

Mike Tang 2020-08-31 08:27

Path::new 那里检查一下api定义看看?

1 共 5 条评论, 1 页