2014-10-12 14 views
6

Tôi muốn viết những dòng này:Trả về một giao diện Iterator đơn giản thay vì một bản đồ trong Rust

fn fibs() -> std::iter::Iterator<int> { 
    return std::iter::iterate((1i, 1i), |(a, b)| { (b, a + b) }).map(|(a, _)| a) 
} 

Nhưng nếu tôi làm, tôi nhận được lỗi này:

error: explicit lifetime bound required 
fn fibs() -> std::iter::Iterator<int> { 
      ^^^^^^^^^^^^^^^^^^^^^^^^ 

Nếu, thay vào đó tôi viết ra giao diện đầy đủ, nó biên dịch:

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) 
} 

Có cách nào để trả về giao diện đơn giản hơn không?

+0

Iterator là một đặc điểm và không phải là một kiểu. Tôi không biết nhiều về Rust nhưng tôi nghĩ bạn cần gói nó trong Box. Để trả về các kiểu trừu tượng không được hộp, chúng ta cần: https://github.com/rust-lang/rfcs/pull/105 – Simon

Trả lời

6

Hiện tại không có cách nào để trả lại loại trừu tượng như Iterator<T>, cũng giống như bạn không thể chỉ định kiểu đó làm loại biến (let x: Iterator<uint>; sẽ không biên dịch vì cùng một lý do).

Điều này has been discussed và chắc chắn là mong muốn; khi nó được thực hiện nó có thể sẽ ở dạng fn fibs() -> impl Iterator<uint>, nhưng bạn không thể làm điều đó được nêu ra.

+0

Có vẻ như vấn đề đã bị đóng: https://github.com/rust-lang/rfcs/ kéo/105. RFC có thay thế bởi RFC khác không? –

+0

Tôi không tin rằng nó đã được cho thời điểm này, nhưng nó sẽ được tại một số điểm. –

+0

Tin tốt, có một tin mới: https://github.com/rust-lang/rfcs/issues/518 –

1

như @ChrisMorgan cho biết, hiện tại bạn không thể trả lại loại tóm tắt. Nếu bạn đang tạo một API công cộng và muốn tránh phụ thuộc quá nhiều vào việc triển khai cụ thể iteratemap, bạn có thể đóng gói kiểu trả về vào cấu trúc của chính bạn (mà ít nhiều là những bộ sưu tập trong thư viện std làm).

Cái gì như:

// 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); 
    } 
} 
+0

Cảm ơn! Tôi nghĩ Swift có cùng một loại điều nhưng chung chung với AnySequence https://developer.apple.com/library/tvos/documentation/Swift/Reference/Swift_AnySequence_Structure/index.html –

Các vấn đề liên quan