簡體   English   中英

自動特征實現不起作用

[英]Automatic trait implementation does not work

在下面的代碼中,您可以看到我強制為實現AsRef<[T]>Index[T]的所有內容實現A ,因此B應該實現它,因為它實現了這兩者。 然而,這種情況並非如此。 為什么?

use std::convert::{AsMut, AsRef};
use std::ops::{Index, IndexMut};
use std::slice::SliceIndex;

pub trait A<T, I: SliceIndex<[T], Output = T>>:
    AsRef<[T]> + Index<I, Output = T> 
{
    fn len(&self) -> usize;
}

impl<
        T: AsRef<[T]>  + Index<I, Output = T>,
        I: SliceIndex<[T], Output = T>,
    > A<T, I> for T
{
    fn len(&self) -> usize {
        self.as_ref().len()
    }
}

struct B<'a, T>{
    data: &'a mut [T]
}

impl<'a, T> AsRef<[T]> for B<'a, T> {
    fn as_ref(&self) -> &[T] {
        self.data
    }
}


impl<'a, T, I: SliceIndex<[T], Output = T>> Index<I> for B<'a, T> {
    type Output = T;

    fn index(
        &self,
        v: I,
    ) -> &Self::Output {
        &self.as_ref()[v]
    }
}


fn something<'a, T>(r: &'a mut[T]) -> Box<dyn A<T, usize>> {
    let a = B{data: r};
    Box::new(a)
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=aa2353139f3d097e2497ed700d678ed3

錯誤:

error[E0277]: the trait bound `B<'_, T>: A<T, usize>` is not satisfied
  --> src/lib.rs:46:5
   |
46 |     Box::new(a)
   |     ^^^^^^^^^^^ the trait `A<T, usize>` is not implemented for `B<'_, T>`
   |
   = note: required for the cast to the object type `dyn A<T, usize, Output = T>`

您需要在A的毯子 impl 上引入一個額外的類型參數:

impl<T, I, V> A<T, I> for V
where
    V: AsRef<[T]> + Index<I, Output = T>,
    I: SliceIndex<[T], Output = T>,
{
    fn len(&self) -> usize {
        self.as_ref().len()
    }
}

修復此問題后,您將收到生命周期錯誤,因為框中返回的特征 object 推斷出'static生命周期”,因此您需要將其綁定到輸入切片的'a生命周期”。

fn something<'a, T>(r: &'a mut [T]) -> Box<dyn A<T, usize> + 'a> {
    let a = B { data: r };
    Box::new(a)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM