我想写这个:
fn fibs() -> std::iter::Iterator<int> {
return std::iter::iterate((1i, 1i), |(a, b)| { (b, a + b) }).map(|(a, _)| a)
}
但如果我这样做,我会收到此错误:
error: explicit lifetime bound required
fn fibs() -> std::iter::Iterator<int> {
^^^^^^^^^^^^^^^^^^^^^^^^
如果我写出完整的界面,它会编译:
fn fibs() -> std::iter::Map<'static, (int, int), int, std::iter::Iterate<'static, (int, int)>> {
return std::iter::iterate((1i, 1i), |(a, b)| { (b, a + b) }).map(|(a, _)| a)
}
有没有办法返回更简单的界面?
答案 0 :(得分:6)
目前还没有任何方法可以返回一个抽象类型,例如Iterator<T>
,就像你不能将它指定为一个变量的类型一样(let x: Iterator<uint>;
不能为它编译原因)。
这has been discussed当然是理想的;当它完成时,它可能采用fn fibs() -> impl Iterator<uint>
的形式,但你还不能这样做。
答案 1 :(得分:1)
正如@ChrisMorgan所说,现在你无法返回一个抽象类型。如果要创建公共API并且希望避免过多地依赖iterate
和map
的具体实现,则可以将返回类型封装到您自己的结构中(这或多或少是集合)在std库本身就可以了。)
类似的东西:
// updated to rustc 0.13.0-nightly (2015-01-02)
use std::iter::{Map, iterate, Unfold};
type Fibs = Map<(int, int), int, Unfold<(int, int),
(fn((int, int)) -> (int, int), Option<(int, int)>, bool),
fn(&mut (fn((int, int)) -> (int, int), Option<(int, int)>, bool)) ->
Option<(int, int)>>, fn((int, int)) -> int>;
struct Fibs2 {
iter: Fibs,
}
impl Fibs2 {
fn iter() -> Fibs2 {
fn inner((a, b): (int, int)) -> (int, int) { (b, a + b) }
let in_fn = inner as fn((int, int)) -> (int, int);
fn first((a, _): (int, int)) -> int { a }
let p_first = first as fn((int, int)) -> int;
Fibs2{ iter: iterate((1i, 1i), in_fn).map(p_first) }
}
}
impl Iterator<int> for Fibs2 {
fn next(&mut self) -> Option<int> {
self.iter.next()
}
}
fn main() {
for fib_n in Fibs2::iter().take(10) {
println!("{}", fib_n);
}
}