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

时间:2015-03-22 16:13:44

标签: rust traits

这是一个小的Rust脚本(是的,我知道{* 1}}是不鼓励的,但它适用于这个简短的例子):

unwrap

我从Rust文档中看到

  • std是一个箱子
  • env是crate fn main() { let args = std::env::args(); let word = args.last().unwrap(); println!("Last argument is {}", word); }
  • 中的一个模块
  • args是模块中的一个功能
  • 该函数返回类型Args的值,结构
  • 结构std实现了特征IteratorExactSizeIterator

但是,就文档而言,ArgsArgsIterator都没有定义名为ExactSizeIterator的方法! last自行定义任何内容,Args只定义Iteratornextsize_hint定义ExactSizeIterator

那么为什么这个脚本有效呢?如何len允许调用last值?文件缺乏还是遗漏了什么?

2 个答案:

答案 0 :(得分:4)

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

这些方法属于范围,因为特征IteratorExt已导入prelude

答案 1 :(得分:2)

有时您需要在文档中使用两个方向。搜索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