2016-08-24 7 views
5

私はラストを学んでいますが、それでも私の頭を掴みようとしています。次のGo定義を考えてみましょう。独自の型を返すRust関数型を定義するにはどうすればよいですか?

type FnType func(paramType) FnType 

これは、同じタイプの関数を返す関数です。同様のことをRustに実装できますか?そして、理想的には一般的に行うことができるので、paramTypeがクライアントによって指定されていますか?

+0

Rustでは、コンパイル時にチェックされたFSMを実装するために、*セッションタイプ*について読むことができます。さもなければ、 'self'(およびイベント)を消費し、' Self'(または 'Result ')を返すメソッドを持つ 'enum'はより柔軟です(しかし、遷移はコンパイル時にチェックされません)。 –

+0

うん、今固定。 – burfl

+1

あなたの紳士/熟女が私の新しい(関連する)質問に答えることを望む人は、ここにあります:http://stackoverflow.com/questions/39130789/in-rust-what-is-the-most-idiomaticway -to-implement-a-simple-fsm – burfl

答えて

3

で見る:

type a = fn(String) -> a; 

は、次のエラーを生成します私は自分自身に答えることができたと思いますが、具体的には中間のタイプ: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 
} 

playgroundで実行されていることを確認できます。

3

巡回型は、錆にサポートされていません:

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. 

は、私はいくつかのドキュメントで掘りや遊び場に連れてなかったplayground

+0

一方、「自己」とのトリックがあるのだろうか? –

+0

私は文脈を追加するために質問を編集しました。おそらく代替ソリューションがあるかもしれません... – burfl

+3

@burfl:代替案がありますが、「再帰的fnを定義する方法」から「FSMを最適に実装する方法」の質問を完全に変更するので、最初の質問に2番目は話題にならないかもしれない、多分...) –

関連する問題