删除Url路径的尾随文件名

And*_*zie 3 rust

我有一个Url,我想获得路径部分,但没有尾随文件名.如果那Urlhttp://my.com/dir1/dir2/file.ext我想得到的/dir1/dir2.

我已经尝试了各种分裂(let parts = url.path().split("/");等等)和收集和加入,代码很糟糕,看起来效率低下.

She*_*ter 7

使用包时,了解包装箱所关注的域很有用.解决绝对URL的相对路径是一种非常常见的情况.对于url crate,这是通过以下方式完成的join:

use url::Url; // 2.1.0

fn main() {
    let u = Url::parse("http://my.com/dir1/dir2/file.ext").unwrap();
    let u2 = u.join("./").unwrap();
    assert_eq!("/dir1/dir2/", u2.path());
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用path_segments_mut:

use url::Url; // 2.1.0

fn main() {
    let mut u = Url::parse("http://my.com/dir1/dir2/file.ext").unwrap();
    u.path_segments_mut().unwrap().pop();
    assert_eq!("/dir1/dir2", u.path());
}
Run Code Online (Sandbox Code Playgroud)


Fre*_*ios 5

您可以使用 rsplitn

extern crate url;

use url::Url;

fn shorten(url: &Url) -> Option<&str> {
    url.path().rsplitn(2, '/').skip(1).next()
}

fn main() {
    let url = Url::parse("http://my.com/dir1/dir2/file.ext").unwrap();
    assert_eq!(shorten(&url), Some("/dir1/dir2"));
}
Run Code Online (Sandbox Code Playgroud)

这不像调用一个方法那样容易,但是至少有效。

如果要更改当前网址,可以使用Url::path_segments_mut

extern crate url;

use url::Url;

fn shorten(mut url: Url) -> Result<Url, ()> {
    url.path_segments_mut()?.pop();
    Ok(url)
}

fn main() {        
    let url = Url::parse("http://my.com/dir1/dir2/file.ext").unwrap();
    assert_eq!(shorten(url).unwrap().path(), "/dir1/dir2");
}
Run Code Online (Sandbox Code Playgroud)