无法更改async函数中的pathBuff/path变量



我不确定是应该在这里发布还是在代码审查中发布。代码审查似乎只有有效的代码。

所以我有很多问题我不太理解。(我是一个新手)完整的代码可以在这里找到: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 ?

你的代码有两个问题。

  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);

第二个问题:

也,似乎使用use 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,
}

相关内容

  • 没有找到相关文章

最新更新