の場合、.max()
は機能しませんので、引数がNaN
ではないことを示すForceOrd
構造体を記述しています。しかし、私はエラーでコンパイルするInto
特性の実装を取得することはできません制約付き構造体のFrom/Intoの実装
let m = xs.iter().map(|&x| ForceOrd(x)).max().unwrap().into();
:意図した使用法のようなものです
conflicting implementations of trait `std::convert::Into<_>` for type `ForceOrd<_>`
コード(playground):
#[derive(PartialEq, PartialOrd)]
pub struct ForceOrd<X: PartialEq + PartialOrd>(pub X);
impl<X: PartialEq + PartialOrd> Eq for ForceOrd<X> { }
impl<X: PartialEq + PartialOrd> Ord for ForceOrd<X> {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.0.partial_cmp(&other.0).unwrap()
}
}
/// doesn't work
impl<X: PartialEq + PartialOrd> Into<X> for ForceOrd<X> {
fn into(x: Self) -> X { x.0 }
}
/// doesn't work either
impl<X: PartialEq + PartialOrd> From<ForceOrd<X>> for X {
fn from(x: ForceOrd<X>) -> Self { x.0 }
}
これに一般的な制約を緩和し、f64で直接実装すると効果がありますか?それはあなたのための選択肢ではありませんか?あなたが持っているような箱の中のオープンジェネリックに特性境界を追加することは可能ではないと思います(_just_ 'From'を実装するとエラーになるはずです) –