2016-10-14 2 views
2

私は、形質IntoIterator<Item = &T>を実装するリファレンス(foo)を持っています。 *fooのタイプもItem = Tであるにもかかわらず実装されているため、*fooの型は(つまり参照自体)で、*foo(参照値)ではなく、traitメソッドinto_iterを直接呼び出す必要があります。私はUFCSを試したことがありますが、それでもそのトリックをしていないようです。 、@ LukasKalbertodtの有益なコメントに感謝参照型ではなく、参照型でtraitメソッドを呼び出すにはどうすればよいですか?

fn csl_join<'a, V, T>(value: &V) -> String 
    where V: IntoIterator<Item = &'a T>, 
      T: 'a + ToString 
{ 
    itertools::join(value.into_iter().map(|v: &T| v.to_string()), ",") 
} 
+0

私は、あなたが達成したいと思っていることは確かではありません。 '&V'は' IntoIterator'を実装していないので、メソッド 'into_iter'を持っていません。 'V'は、その特性を実装しているので、メソッドを持っています。また、 '&IntoIterator <...>'と '&V、V:IntoIterator <...>'の間には重要な違いがあります。だから私が唯一の混乱した読者ではない場合:少し質問を明確にすることができますか? :) –

+0

@ LukasKalbertodt:私の悪い。私は特色の境界で愚かであった!質問を削除します。ありがとうございます。 – Noldorin

+0

別の言い方をすると、 '* value'の代わりに' value'を呼び出すときにどのような振る舞いの違いがありますか? –

答えて

5

私はちょうどそれを掲示した後、この問題を解決することになった:

は、ここに私の実際のコードです。関数body(duh!)の目的とする使用法に合致するように、バインドされた型が&V: IntoIterator<Item = &T>であることが必要でした。

ので、コードは次のようになります。

fn csl_join<'a, 'b, V, T>(value: &'a V) -> String 
    where V: 'a, 
      &'a V: IntoIterator<Item = &'b T>, 
      T: ToString + 'b 
{ 
    itertools::join(value.into_iter().map(|v: &T| v.to_string()), ",") 
} 

それが偶然、他の誰かを支援する場合には、私はここにこれを残しておきます。

関連する問題