如何允许为 Args 值调用“last”?

How is `last` allowed to be called for an Args value?

这是一个小的 Rust 脚本(是的,我知道不鼓励使用 unwrap,但它适用于这个简短的示例):

fn main() {
    let args = std::env::args();
    let word = args.last().unwrap();
    println!("Last argument is {}", word);
}

我从 Rust 文档中看到

但是,据我从文档中得知,ArgsIteratorExactSizeIterator 都没有定义名为 last 的方法! Args 本身不定义任何内容,Iterator 仅定义 nextsize_hint,而 ExactSizeIterator 定义 len.

为什么这个脚本有效?如何允许 last 被调用以获得 Args 值?是缺少文档还是我遗漏了什么?

last 方法来自 IteratorExt 特征,它通过 impl<I> IteratorExt for I where I: Iterator 一揽子实现为所有迭代器定义方法。

这些方法在范围内,因为特征 IteratorExt 是在 prelude.

中导入的

有时您需要在文档中进行双向操作。搜索 last 将带您到 IteratorExt::last:

fn last(self) -> Option<<Self as Iterator>::Item>

IteratorExt 定义为:

pub trait IteratorExt where Self: Iterator {
    // ...
}

这是一个 扩展特征 - 一个全部应用于另一个特征的方法集合。这样做是为了帮助保护 对象安全 ,因为其中一些方法需要使用参数,这意味着参数必须具有已知大小。该特征有一个 全面实施 来应用它:

impl<I> IteratorExt for I where I: Iterator

但是,有一些 work recently 可以减少扩展特征的数量,因为人们意识到您可以简单地向某些方法添加 Sized 的界限。有可能其中一些可能适用于 IteratorExt,他们将移回 Iterator 正确。