2017-11-24 13 views
2

私はimplementing tuple flatteningのために錆です。特化可能な関連タイプをデフォルトメソッドから戻すにはどうすればよいですか?

/// For non-tuple types. 
impl<T> IntoCons for Val<T> { 
    default type Out = Cons<T, Nil>; 

    default fn into_cons(self) -> Cons<T, Nil> { 
     Cons { 
      head: self, 
      tail: Nil, 
     } 
    } 
} 

はどうすればこれを行うことができます:それは、私は専門を使用してみましたが、コンパイラがそれを好きではない

Cons[ 
    Cons[A, B, Nil], 
    Cons[ 
     C, Cons[D, E, Nil], Nil 
    ], 
    F, 
    Nil 
] 

((A,B), (C, (D, E)), F) 

の変換が必要ですか? unsafeを使用しない代替方法は問題ありません。

コンプリート例:

#![feature(specialization)] 
use std::fmt::{Debug, Display}; 

pub trait Tr { 
    type It; 
    fn it(self) -> Self::It; 
} 

impl<T> Tr for T 
where 
    T: Debug, 
{ 
    default type It = u8; 

    default fn it(self) -> Self::It { 
     0 
    } 
} 

impl<T> Tr for T 
where 
    T: Debug + Display, 
{ 
    type It = u16; 

    fn it(self) -> Self::It { 
     0 
    } 
} 

fn main() {} 

playground

コンパイラ出力:

error[E0308]: mismatched types 
    --> src/main.rs:17:9 
    | 
16 |  default fn it(self) -> Self::It { 
    |       -------- expected `<T as Tr>::It` because of return type 
17 |   0 
    |  ^expected associated type, found integral variable 
    | 
    = note: expected type `<T as Tr>::It` 
       found type `{integer}` 

答えて

1

ここでの問題は、あなたがSelf::Itを返すが、それを誰かがした場合どうなります0を与えているということですItStringの場合はこれを実装しますか?これが常に数字になることを証明する方法がないので、特性の境界が必要か、メソッドのシグネチャを変更する必要があります。これはでの実装ではありません - 誰かがそれは `STRING` *であることでこれを実装した場合はどうなります

pub trait Tr { 
    type It: Default; 
    fn it(self) -> Self::It; 
} 

impl<T> Tr for T 
where 
    T: Debug, 
{ 
    default type It = u8; 

    default fn it(self) -> Self::It { 
     Default::default() 
    } 
} 

Playground Link

+0

*:

それを行うための可能な方法は、このようなものです*特性*、ブランケットの実装です。あなたが[デフォルトと特殊化されたimplを削除する](https://play.integer32.com/?gist=bbeb840a5ab82e605c2ad8e35938bc76&version=stable)なら、コードは機能します。特殊実装を通常の実装と異なるものにするにはどうすればよいですか? – Shepmaster

+1

その場合、それは具体的なタイプなので。 コンパイルするには 'Default type It = u8;'のみが必要です。 Default特性バインドでは、その実装は常に機能します。 ここをクリックしてください:https://play.rust-lang.org/?gist=0f5da74bbfbbf4f818cefa134d27f4fc&version=nightly – Neikos

+0

私はDefault :: default()からcreteadできる単純なものを返すことはしませんが、私はこの答えを私の例は間違っていました。私はこれを解決するために念頭を使います。私は永遠に不安定なように見えるので、卵母音を使いたくはありませんでしたが、効果があり、専門化機能がその症例を改善することが期待されます – kdy

関連する問題