Rollup merge of #48420 - teiesti:path_parents, r=BurntSushi
Fixes #47311. r? @nrc
This commit is contained in:
@@ -1035,6 +1035,50 @@ impl<'a> cmp::Ord for Components<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An iterator over [`Path`] and its ancestors.
|
||||||
|
///
|
||||||
|
/// This `struct` is created by the [`ancestors`] method on [`Path`].
|
||||||
|
/// See its documentation for more.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(path_ancestors)]
|
||||||
|
///
|
||||||
|
/// use std::path::Path;
|
||||||
|
///
|
||||||
|
/// let path = Path::new("/foo/bar");
|
||||||
|
///
|
||||||
|
/// for ancestor in path.ancestors() {
|
||||||
|
/// println!("{}", ancestor.display());
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// [`ancestors`]: struct.Path.html#method.ancestors
|
||||||
|
/// [`Path`]: struct.Path.html
|
||||||
|
#[derive(Copy, Clone, Debug)]
|
||||||
|
#[unstable(feature = "path_ancestors", issue = "48581")]
|
||||||
|
pub struct Ancestors<'a> {
|
||||||
|
next: Option<&'a Path>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unstable(feature = "path_ancestors", issue = "48581")]
|
||||||
|
impl<'a> Iterator for Ancestors<'a> {
|
||||||
|
type Item = &'a Path;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
let next = self.next;
|
||||||
|
self.next = match next {
|
||||||
|
Some(path) => path.parent(),
|
||||||
|
None => None,
|
||||||
|
};
|
||||||
|
next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unstable(feature = "fused", issue = "35602")]
|
||||||
|
impl<'a> FusedIterator for Ancestors<'a> {}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Basic types and traits
|
// Basic types and traits
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -1820,6 +1864,37 @@ impl Path {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Produces an iterator over `Path` and its ancestors.
|
||||||
|
///
|
||||||
|
/// The iterator will yield the `Path` that is returned if the [`parent`] method is used zero
|
||||||
|
/// or more times. That means, the iterator will yield `&self`, `&self.parent().unwrap()`,
|
||||||
|
/// `&self.parent().unwrap().parent().unwrap()` and so on. If the [`parent`] method returns
|
||||||
|
/// [`None`], the iterator will do likewise. The iterator will always yield at least one value,
|
||||||
|
/// namely `&self`.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(path_ancestors)]
|
||||||
|
///
|
||||||
|
/// use std::path::Path;
|
||||||
|
///
|
||||||
|
/// let mut ancestors = Path::new("/foo/bar").ancestors();
|
||||||
|
/// assert_eq!(ancestors.next(), Some(Path::new("/foo/bar")));
|
||||||
|
/// assert_eq!(ancestors.next(), Some(Path::new("/foo")));
|
||||||
|
/// assert_eq!(ancestors.next(), Some(Path::new("/")));
|
||||||
|
/// assert_eq!(ancestors.next(), None);
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// [`None`]: ../../std/option/enum.Option.html#variant.None
|
||||||
|
/// [`parent`]: struct.Path.html#method.parent
|
||||||
|
#[unstable(feature = "path_ancestors", issue = "48581")]
|
||||||
|
pub fn ancestors(&self) -> Ancestors {
|
||||||
|
Ancestors {
|
||||||
|
next: Some(&self),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the final component of the `Path`, if there is one.
|
/// Returns the final component of the `Path`, if there is one.
|
||||||
///
|
///
|
||||||
/// If the path is a normal file, this is the file name. If it's the path of a directory, this
|
/// If the path is a normal file, this is the file name. If it's the path of a directory, this
|
||||||
|
|||||||
Reference in New Issue
Block a user