-1

我不确定是否应该在此处或代码审查中发布此内容。代码审查似乎只有功能代码。

所以我有很多我不太了解的问题。(我是菜鸟)完整的代码可以在这里找到:https ://github.com/NicTanghe/winder/blob/main/src/main.rs 主要问题在这里:

let temp = location_loc1.parent().unwrap();
location_loc1.push(&temp);

我尝试了各种方法来解决可变或引用借用的问题,但我似乎无法让它发挥作用。

我尝试的每件事都会遇到不同的错误。此外,如果这是重复的,我很抱歉,但是寻找错误的单独解决方案只会给我一个不同的错误。在一个圈子里。

全功能

async fn print_events(mut selector_loc1:i8, location_loc1: PathBuf) {
    let mut reader = EventStream::new();

    loop {
        //let delay = Delay::new(Duration::from_millis(1_000)).fuse();
        let mut event = reader.next().fuse();

        select! {
            // _ = delay => {
            //      print!("{esc}[2J{esc}[1;1H{}", esc = 27 as char,); 
                 
            // },
            maybe_event = event => {
                match maybe_event {
                    Some(Ok(event)) => {
                        //println!("Event::{:?}\r", event);
                        
                        // if event == Event::Mouse(MouseEvent::Up("Left").into()) {
                        //     println!("Cursor position: {:?}\r", position());
                        // }   
                        print!("{esc}[2J{esc}[1;1H{}", esc = 27 as char,); 
                        if event == Event::Key(KeyCode::Char('k').into()) {
                            if selector_loc1 > 0 {
                                selector_loc1 -= 1;
                            };
                            //println!("go down");
                            //println!("{}",selected)

                        }   else if event == Event::Key(KeyCode::Char('j').into()) {
                            selector_loc1 += 1;
                            //println!("go up");
                            //println!("{}",selected)
                        }   else if event == Event::Key(KeyCode::Char('h').into()) {


                        //-----------------------------------------
                        //-------------BackLogic-------------------
                        //-----------------------------------------
                            let temp = location_loc1.parent().unwrap();
                            location_loc1.push(&temp);
                            
                        //------------------------------------------
                        //------------------------------------------

                        }   else if event == Event::Key(KeyCode::Char('l').into()) {
                            //go to next dir

                        }   if event == Event::Key(KeyCode::Esc.into()) {
                            break;
                        }

                        printtype(location_loc1,selector_loc1);

                    }
                    Some(Err(e)) => println!("Error: {:?}\r", e),
                    None => break,
                }
            }
        };
    }
}

此外,它似乎使用

use async_std::path::{Path, PathBuf};

使 rust 无法识别 unwrap() 函数 → 我将如何使用 using ?

4

1 回答 1

1

您的代码有两个问题。

  1. PathBuf的是不可变的。不可能修改不可变对象,除非它们支持内部可变性PathBuf才不是。因此,您必须使变量可变。您可以mut像这样在它前面添加:
async fn print_events(mut selector_loc1:i8, mut location_loc1: PathBuf) {

或者你可以重新绑定它:

let mut location_loc1 = location_loc1;
  1. 你不能同时借用它可变和不可变——可变借用是排他的!鉴于该方法.parent()借用了缓冲区,您必须创建一个临时拥有的值:
// the PathBuf instance
let mut path = PathBuf::from("root/parent/child");

// notice the .map(|p| p.to_owned()) method - it helps us avoid the immutable borrow
let parent = path.parent().map(|p| p.to_owned()).unwrap();

// now it's fine to modify it, as it's not borrowed
path.push(parent);

你的第二个问题:

此外,似乎 usinguse async_std::path::{Path, PathBuf};使 rust 无法识别 unwrap() 函数→我将如何使用 using ?

async-std 版本只是 std 的一个包装器PathBuf。它只是委托给标准实现,因此它的行为不应有所不同

// copied from async-std's PathBuf implementation
pub struct PathBuf {
    inner: std::path::PathBuf,
}
于 2021-07-29T15:14:40.827 回答