这是一个小的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
实现了特征Iterator
和ExactSizeIterator
但是,就文档而言,Args
,Args
和Iterator
都没有定义名为ExactSizeIterator
的方法! last
自行定义任何内容,Args
只定义Iterator
和next
,size_hint
定义ExactSizeIterator
。
那么为什么这个脚本有效呢?如何len
允许调用last
值?文件缺乏还是遗漏了什么?
答案 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
。