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() {}
コンパイラ出力:
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}`
*:
それを行うための可能な方法は、このようなものです*特性*、ブランケットの実装です。あなたが[デフォルトと特殊化されたimplを削除する](https://play.integer32.com/?gist=bbeb840a5ab82e605c2ad8e35938bc76&version=stable)なら、コードは機能します。特殊実装を通常の実装と異なるものにするにはどうすればよいですか? – Shepmaster
その場合、それは具体的なタイプなので。 コンパイルするには 'Default type It = u8;'のみが必要です。 Default特性バインドでは、その実装は常に機能します。 ここをクリックしてください:https://play.rust-lang.org/?gist=0f5da74bbfbbf4f818cefa134d27f4fc&version=nightly – Neikos
私はDefault :: default()からcreteadできる単純なものを返すことはしませんが、私はこの答えを私の例は間違っていました。私はこれを解決するために念頭を使います。私は永遠に不安定なように見えるので、卵母音を使いたくはありませんでしたが、効果があり、専門化機能がその症例を改善することが期待されます – kdy