2017-07-11 8 views
2

文字列を空白と他のいくつかの文字に分割する必要があります。明示的に値の型を推論することはできません

let mut text = String::from("foo,bar baz"); 
for word in text.split(|c| c.is_whitespace::<char>() || c == ',').filter(|&s| !s.is_empty()) { 
    println!("{}", word); 
} 

しかしコンパイラは言う:

error: the type of this value must be known in this context 
--> src/main.rs:4:32 
    | 
4 |  for word in text.split(|c| c.is_whitespace::<char>() || c == ',').filter(|&s| !s.is_empty()) { 
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^ 

は私が間違って何をしているのですか?なぜ型を推論できないのですか?

答えて

3

.splitメソッドは、Pattern<'a>特質を満たすものをすべて受け入れます。この場合、Rustは関数の型が何であるかを知らないので、これがどの型の関数であるかを知ることができません。 FnMutの実装があるPatternを見てみると

impl<'a, F> Pattern<'a> for F 
where 
    F: FnMut(char) -> bool, 

これはあなたが望むパターンでコンパイラに指示するには、あなたはそれがあなたの閉鎖がこれを一致していることを知るための十分な情報を提供する必要があります。

この場合、: charを追加できます。 unneeded type parameterであるため、::<char>も削除する必要があります。例えばC |

text.split(|c: char| c.is_whitespace() || c == ',') 
+0

や 'へ

text.split(|c| c.is_whitespace::<char>() || c == ',') 

| char :: is_whitespace(c)|| c == '、' ' - 何らかの理由で、私はクロージャ引数リストで型を指定することを嫌います。 – Shepmaster

+0

Fair。このようなことに関するコミュニティガイドラインはありますか? – loganfsmyth

+0

私はこの特定の場合には何もないと思います。これは私の純粋な好みです。 Rustfmtは公式スタイルのための私の普通の行為です。 – Shepmaster

関連する問題