私はラストを学んでいますが、それでも私の頭を掴みようとしています。次のGo定義を考えてみましょう。独自の型を返すRust関数型を定義するにはどうすればよいですか?
type FnType func(paramType) FnType
これは、同じタイプの関数を返す関数です。同様のことをRustに実装できますか?そして、理想的には一般的に行うことができるので、paramType
がクライアントによって指定されていますか?
私はラストを学んでいますが、それでも私の頭を掴みようとしています。次のGo定義を考えてみましょう。独自の型を返すRust関数型を定義するにはどうすればよいですか?
type FnType func(paramType) FnType
これは、同じタイプの関数を返す関数です。同様のことをRustに実装できますか?そして、理想的には一般的に行うことができるので、paramType
がクライアントによって指定されていますか?
で見る:
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で実行されていることを確認できます。
巡回型は、錆にサポートされていません:
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
一方、「自己」とのトリックがあるのだろうか? –
私は文脈を追加するために質問を編集しました。おそらく代替ソリューションがあるかもしれません... – burfl
@burfl:代替案がありますが、「再帰的fnを定義する方法」から「FSMを最適に実装する方法」の質問を完全に変更するので、最初の質問に2番目は話題にならないかもしれない、多分...) –
Rustでは、コンパイル時にチェックされたFSMを実装するために、*セッションタイプ*について読むことができます。さもなければ、 'self'(およびイベント)を消費し、' Self'(または 'Result')を返すメソッドを持つ 'enum'はより柔軟です(しかし、遷移はコンパイル時にチェックされません)。 –
うん、今固定。 – burfl
あなたの紳士/熟女が私の新しい(関連する)質問に答えることを望む人は、ここにあります:http://stackoverflow.com/questions/39130789/in-rust-what-is-the-most-idiomaticway -to-implement-a-simple-fsm – burfl