2016-12-22 5 views
2

構造体のimplにある関数からforループ内にある関数ポインタを返そうとしています。内部ループからの戻り型の不一致

fn locate_func(&self, string: &str) -> fn() -> bool { 
    let mut func; 

    for alt in &self.alts { 
     return alt.func; 
    } 
} 

は、将来的にforループ内ifの文がありますが、私は非常に現時点で物事をテストしていて、それはかなり一般的な、やや非論理的に見えます。

私の心の中で上記のコードは、それが私に語ったので、私はそのラインのリターンとセミコロンを削除する必要がありますように、明らかにポインタである、alt.func()へのポインタを返すことになっています。

error[E0308]: mismatched types 
    --> src\main.rs:42:3 
    | 
42 |   for alt in &self.alts 
    |   ^expected fn pointer, found() 
    | 
    = note: expected type `fn() -> bool` 
    = note: found type `()` 

以上は、実行時に発生するエラーです。locate_func()です。上記のコードが正しく動作していないので、私は明らかに何かが欠落しています。何かヒント?

+1

'self.alts'が空の場合、あなたは何を返そうとしていますか? – user4815162342

+0

そうでないことが保証されています。 –

+0

しかし、これはコードポイントに優れています。 –

答えて

3

for -loopは、関数内の最後のの式です。コンパイラは、最後のが戻り値の型に評価されることを期待しています。しかし、すべてのループは()ユニットまたはvoid)と評価されます。そのため、コンパイラに古典的な型の不一致があります。

自分自身に尋ねる正しい質問は、ループ内にreturnが実行されない場合(たとえば、self.altsが空であるためにループが実行されないなど)はどうなりますか?これは問題につながるでしょうか?

for -loopの後に有効なオブジェクトを返さなければなりません。 しかしループの後の場所に到達しないことが確実であれば、unreachable!();を使用して既に知っていることをコンパイラに伝えることができます。しかし、プログラムがこの場所に到達すると、それはパニックになります!そうすれば、プログラムがどのように動作するかを確実に知ることができます。

+1

そして、元のケースでは、ループ内に 'if'があるところで、' self.alts.iter()。find(...)。expect( "funcが必要です")'。 – Shepmaster