rust impl for T和FnMut()-> T的某个值之间的性状冲突

f87krz0w  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(126)

所以我有这个特点来填充各种类型的数组,但是我得到了TF: FnMut() -> T的冲突实现。我猜唯一的重叠点是F: FnMut() -> F的情况,在这种情况下,函数F返回自身并等于T。本质上,编译器考虑了FFnMut() -> (FnMut() -> (FnMut() -> ...))的可能性。
下面是无法编译的代码:

pub trait ArrayFill<T, const LENGTH: usize>
{
    fn fill_into_array(self) -> [T; LENGTH];
}

impl<T, const LENGTH: usize> ArrayFill<T, LENGTH> for T
where
    T: Copy
{
    fn fill_into_array(self) -> [T; LENGTH]
    {
        [self; LENGTH]
    }
}
impl<F, T, const LENGTH: usize> ArrayFill<T, LENGTH> for F
where
    F: FnMut() -> T
{
    fn fill_into_array(self) -> [T; LENGTH]
    {
        todo!()
    }
}

字符串
我试过使用auto-trait和F: FnMut() -> F的否定实现,但即使这样,冲突仍然存在,因为我不认为编译器能够正确地推理否定实现。尝试的解决方案如下所示:

#![feature(auto_traits)]
#![feature(negative_impls)]

auto trait NotFnMutToSelf {}
impl<F> !NotFnMutToSelf for F
where
    F: FnMut() -> F {}

pub trait ArrayFill<T, const LENGTH: usize>
{
    fn fill_into_array(self) -> [T; LENGTH];
}

impl<T, const LENGTH: usize> ArrayFill<T, LENGTH> for T
where
    T: Copy + NotFnMutToSelf
{
    fn fill_into_array(self) -> [T; LENGTH]
    {
        [self; LENGTH]
    }
}
impl<F, T, const LENGTH: usize> ArrayFill<T, LENGTH> for F
where
    F: FnMut() -> T
{
    fn fill_into_array(self) -> [T; LENGTH]
    {
        todo!()
    }
}


我不认为专门化可以解决这个问题,因为尽管实现重叠,但它们都不完全重叠。
有什么办法解决这个矛盾吗?

wgeznvg7

wgeznvg71#

不幸的是,这是不可能的。像这样的情况甚至在专门化RFC中描述过,因为建议的RFC * 不会 * 解决。

相关问题