2016-03-06 29 views
10

Tôi đang cố thực hiện một hàm trả về kết thúc đệ quy. Mặc dù tôi không chắc chắn cách thể hiện điều đó trong chữ ký hàm. Dưới đây là mã ví dụ về triển khai hoạt động trong PythonChữ ký chức năng để trả lại một kết thúc đệ quy

def counter(state): 
    def handler(msg): 
     if msg == 'inc': 
      print state 
      return counter(state + 1) 

     if msg == 'dec': 
      print state 
      return counter(state - 1) 
    return handler 

c = counter(1) 
for x in range(1000000): 
    c = c('inc') 

và mã giả cho Rust.

enum Msg { 
    Inc, 
    Dec 
} 

fn counter(state: Int) -> ? { 
    move |msg| match msg { 
     Msg::Inc => counter(state + 1), 
     Msg::Dec => counter(state - 1), 
    } 
} 

Trả lời

11

Vì Rust hỗ trợ các loại đệ quy, bạn chỉ cần để mã hóa các đệ quy trong một cấu trúc riêng biệt:

enum Msg { 
    Inc, 
    Dec, 
} 

// in this particular example Fn(Msg) -> F should work as well 
struct F(Box<FnMut(Msg) -> F>); 

fn counter(state: i32) -> F { 
    F(Box::new(move |msg| match msg { 
     Msg::Inc => { 
      println!("{}", state); 
      counter(state + 1) 
     } 
     Msg::Dec => { 
      println!("{}", state); 
      counter(state - 1) 
     } 
    })) 
} 

fn main() { 
    let mut c = counter(1); 
    for _ in 0..1000 { 
     c = c.0(Msg::Inc); 
    } 
} 

Chúng ta không thể bỏ đấm bốc ở đây, không may - kể từ khi đóng cửa không có hộp bọc có các loại unnameable, chúng tôi cần phải xếp chúng vào một đối tượng đặc điểm để có thể đặt tên chúng bên trong khai báo cấu trúc.

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