rust E0277:在使用具有固定大小数组类型的AsRef时,是否有解决特征界限模糊的方法?(例如,'impl AsRef〈[u8;3]>')

mtb9vblg  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(131)

我试图使impl AsRef<[u8; 3]>在函数参数中工作。
Playground再现:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e99007b0571ed2f088b3e38a6692ccdf
下面是MPE

fn print_bytes_3(bytes: impl AsRef<[u8; 3]>)
{
    println!("{:?}", bytes.as_ref());
}

pub fn main() {
    let a: [u8; 3] = [1, 2, 3];
    print_bytes_3(a);
}

以上代码无法编译,并显示以下错误消息:

Compiling playground v0.0.1 (/playground)
error[E0277]: the trait bound `[u8; 3]: AsRef<[u8; 3]>` is not satisfied
 --> src/main.rs:8:19
  |
8 |     print_bytes_3(a);
  |     ------------- ^ the trait `AsRef<[u8; 3]>` is not implemented for `[u8; 3]`
  |     |
  |     required by a bound introduced by this call
  |
  = help: the following other types implement trait `AsRef<T>`:
            [T; N]
            [T]
note: required by a bound in `print_bytes_3`
 --> src/main.rs:1:30
  |
1 | fn print_bytes_3(bytes: impl AsRef<[u8; 3]>)
  |                              ^^^^^^^^^^^^^^ required by this bound in `print_bytes_3`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `playground` due to previous error

AsRef文档中写到trait为通用固定大小数组实现:
impl<T, const N: usize> AsRef<[T]> for [T; N]
如果我理解正确的话,编译器似乎无法确定使用AsRef的哪个实现。
在错误消息之后,它与其他trait实现冲突,即impl<T> AsRef<[T]> for [T]

= help: the following other types implement trait `AsRef<T>`:
            [T; N]
            [T]

经过一些调整后,这段代码可以正常工作:

fn print_bytes_3(bytes: &[u8; 3])
{
    println!("{:?}", bytes);
}

pub fn main() {
    let a: [u8; 3] = [1, 2, 3];
    print_bytes_3(&a);
}

但是,我仍然想利用AsRef所提供的:impl AsRef<[u8; 3]>在我的函数参数,因为它可以接受拥有和借用类型,而无需指定&
有什么方法可以解决编译器无法确定的歧义吗?或者让我知道我是否做错了什么(我是Rust的新手)。

2wnc66cl

2wnc66cl1#

问题是你想要一个&[u8;3],但是数组的AsRef<[u8;3]>实现不存在,你指向的是AsRef<[u8]>定义,如果你从函数声明中移除;3,你的代码就会运行:

fn print_bytes_3(bytes: impl AsRef<[u8]>) {
    println!("{:?}", bytes.as_ref());
}

如果你只想取一个固定大小的数组,那么只要它们的元素实现了Copy,那么这个数组也是一样的:

fn print_bytes_3(bytes: [u8; 3]) {
    println!("{:?}", bytes);
}

相关问题