2017-05-29 3 views
4

私は完全な署名をコピー/ペーストしないようにFnMut(&[f32]) -> f32、 で仕事をしたいが、私は別名のいくつかの種類をご紹介したいのですが、特定のFnMutのエイリアスを作成する方法はありますか?

type Boo = FnMut(&[f32]) -> f32; 

fn f<F: Boo>(mut f: F) {} 

は、コンパイラエラーが発生します。

error[E0404]: expected trait, found type alias `Boo` 
--> src/main.rs:3:13 
    | 
3 |  fn f<F: Boo>(mut f: F) {} 
    |    ^^^ type aliases cannot be used for traits 

私は、試してみました:

trait Boo: FnMut(&[f32]) -> f32 {} 

fn f<F: Boo>(mut f: F) {} 

それがコンパイルされますが、私は別の場所で特色の代わりにBooを使用しようとした場合:

trait Boo: FnMut(&[f32]) -> f32 {} 

struct X(Vec<Box<Boo>>); 

私が取得:

error[E0191]: the value of the associated type `Output` (from the trait `std::ops::FnOnce`) must be specified 
--> src/main.rs:3:18 
    | 
3 | struct X(Vec<Box<Boo>>); 
    |     ^^^ missing associated type `Output` value 

は、私が代わりにFnMut(&[f32]) -> f32の を使用することができ、特定のFnMutのエイリアスを作成する方法はありますか?

答えて

5

現在、エイリアスは言語の一部ではありません。しかし、正確にはaccepted RFCがあります。それがいつ実装されるのかを正確に予測することは難しいですが、RFCを受け入れることは、将来のある時点で実装するコミットメントを表しています。

エラーの原因はBooの特性がFnMutのサブタイプであり、どの実装でも必要な関連タイプOutputを提供する必要があるためです。

struct X(Vec<Box<Boo<Output = f32>>>); 

これは少し不格好であり、それは改善のための領域だような気がします。しかし、コンパイラは、まだあなたがOutputのタイプがどうなるか、それを伝える必要がありますので、提供される実装を知りません。直観的には-> f32からOutputが推測できるようですが、ここで間違っている可能性があります。

Booは厳密にはFnMut(&[f32])のサブタイプであるため、Booが期待される閉鎖を提供することはできません。その閉鎖はまた、あなたの特性を実装する必要があります。今、任意のBooは(サブタイプ別)FnMut(&[f32]) -> f32ある

impl <F> Boo for F where F: FnMut(&[f32]) -> f32 {} 

を、どのFnMut(&[f32]) -> f32は(ブランケット実装によって)Booです:あなたはこのように、すべてのFnMut(&[f32]) -> f32用毛布実装としてこれを行うことができます。

+0

はい、質問をする前にこのRFCについて読んでいます。問題は現在の安定版/ベータ版コンパイラで何をすべきかです。ハッキング/トリック/マクロ – user1244932

関連する問題