我试图使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的新手)。
1条答案
按热度按时间2wnc66cl1#
问题是你想要一个
&[u8;3]
,但是数组的AsRef<[u8;3]>
实现不存在,你指向的是AsRef<[u8]>
定义,如果你从函数声明中移除;3
,你的代码就会运行:如果你只想取一个固定大小的数组,那么只要它们的元素实现了
Copy
,那么这个数组也是一样的: