2016-08-24 14 views
5

Uczę się Rusta, a wciąż bardzo staram się go obejść. Rozważmy następującą definicję Go:Jak zdefiniować typ funkcji Rust, który zwraca swój własny typ?

type FnType func(paramType) FnType 

To tylko funkcja, która zwraca funkcję tego samego typu. Czy coś podobnego może zostać zaimplementowane w Rust? A najlepiej, czy można to zrobić w sposób ogólny, tak aby klient określił paramType?

+0

W Rustu możesz przeczytać o * typach sesji *, aby zastosować narzędzia FSM do sprawdzania w czasie kompilacji. W przeciwnym razie, 'enum' z metodą konsumującą' self' (i zdarzenie) i zwracającą 'Self' (lub' Result ') jest bardziej elastyczny (ale przejścia nie są sprawdzane w czasie kompilacji). –

+0

Tak, ustalam teraz. – burfl

+1

Jeśli którykolwiek z was grzywny panów/panie chcą odpowiedzieć na moje nowe (powiązane) pytanie, to tutaj: http://stackoverflow.com/questions/39130789/in-rust-what-is-to-most-idiomatic-way -to-implement-a-simple-fsm – burfl

Odpowiedz

3

zrobiłem kilka kopanie w docs i wziął na plac zabaw i Myślę, że sam byłem w stanie odpowiedzieć na to pytanie, chociaż wymaga to typu pośredniego: enum.

fn main() { 
    let mut state = State::Some(first); 
    while let State::Some(s) = state { 
     state = s(0) 
    } 
} 

enum State<T> { 
    Some(fn(T) -> State<T>), 
    None, 
} 

fn first(_: i32) -> State<i32> { 
    println!("First"); 
    State::Some(second) 
} 

fn second(_: i32) -> State<i32> { 
    println!("Second"); 
    State::None 
} 

Można sprawdzić, czy działa pod numerem playground.

3

Cykliczne typy są obsługiwane w Rust:

type a = fn(String) -> a; 

dała następujący błąd:

error: unsupported cyclic reference between types/traits detected [--explain E0391] 
--> <anon>:1:24 
    |> 
1 |> type a = fn(String) -> a; 
    |>      ^
note: the cycle begins when processing `a`... 
note: ...which then again requires processing `a`, completing the cycle. 

Zobacz na playground

+0

Z drugiej strony ... Zastanawiam się, czy istnieje sztuczka z 'Self'? –

+0

Edytowałem pytanie, aby dodać kontekst. Być może istnieje alternatywne rozwiązanie ... – burfl

+3

@burfl: Istnieją alternatywy, ale ponieważ całkowicie zmieniają one pytanie z "jak zdefiniować rekurencyjny fn" na "jak najlepiej wdrożyć FSM" ... trzymajmy się pierwszego pytania (drugi może być nie na temat, może ...) –

Powiązane problemy