繁体   English   中英

如何在 Rust 中按值返回结构?

[英]How to return a struct by value in Rust?

我正在学习 Rust 并且第一步已经失败了......我有下一个 function:

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

fn get_path() -> Path {
    let args: Vec<String> = env::args().collect();
    assert!(!args.is_empty(), "Target path is required!");
    let path = Path::new(&args[0]);
    assert!(path.exists(), "Target path doesn't exist!");
    assert!(path.is_dir(), "Target path is not a directory!");
    return path;
}

这是非常简单的 function 但path是一个参考,我不知道如何从 function 按值返回Path object? 或者如何返回将在外部 function 上下文中存在的引用?

PS我寻找了类似的问题,但不幸的是我没有得到它。

严格来说, Path不是一个引用,它是一个大小不一的类型,只能存在于引用后面,实际上Path::new返回&Path而不是Path 因此,这与您注释 function 的-> Path不兼容。

这些实际上是编译错误告诉您的两件事,并且您真的想在发布 Rust 代码时给人们编译错误(或再现案例),因为一旦您习惯了这些错误,它们就会提供非常丰富的信息:

error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
 --> src/lib.rs:4:18
  |
4 | fn get_path() -> Path {
  |                  ^^^^ borrow the `Path` instead
  |

表示您返回的是不允许的未调整大小的类型),并且

error[E0308]: mismatched types
  --> src/lib.rs:10:12
   |
4  | fn get_path() -> Path {
   |                  ---- expected `std::path::Path` because of return type
...
10 |     return path;
   |            ^^^^ expected struct `std::path::Path`, found `&std::path::Path`

说明您要返回的类型与您要返回的值的类型不匹配。

无论如何,作为Path notes 的官方文档, Path Path拥有/结构版本是PathBuf ,因此您应该返回它,并将您的Path转换为PathBuf ,或者实际上只是首先创建一个PathBuf ,例如

use std::env;
use std::path::PathBuf;

fn get_path() -> PathBuf {
    let args: Vec<String> = env::args().collect();
    assert!(!args.is_empty(), "Target path is required!");
    let path = PathBuf::from(&args[0]);
    assert!(path.exists(), "Target path doesn't exist!");
    assert!(path.is_dir(), "Target path is not a directory!");
    path
}

顺便,

 Path::new(&args[0]);

可能不是您期望或想要的:作为std::env::args的文档说明:

第一个元素通常是可执行文件的路径

这不是 Rust 认为适合偏离底层系统的领域。

您可能需要args[1] ,或者使用更高级别的 args 解析 API。

还有一个与 Sven Marnach 对您的问题的评论有关的另一边:调用path.exists然后path.is_dir需要两次获取元数据(我认为 Rust 不会缓存此信息)。 效率方面在这里可能不是原始的,但您可能仍想显式使用Path::metadata ,然后询问 if is_dir (如果路径不是有效的磁盘上的东西 Path::metadata将返回Err )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM