我在 Rust 中撰寫了一個具有夜間功能的固定大小的位序列型別,generic_const_exprs并且int_roundings我能夠impl BitAndAssign這樣做(我沒有包含正文,因為沒有必要驗證第一個示例是否構建和第二個沒有):
trait Bits {
const BITS: u32;
}
impl Bits for u32 {
const BITS: u32 = Self::BITS;
}
const fn bslen(x: u32, b: u32) -> usize {
x.div_ceil(b) as usize
}
struct BitSet<const X: u32, T: Bits = u32>
where
[(); bslen(X, T::BITS)]:
{
data: [T; bslen(X, T::BITS)]
}
use std::ops::BitAndAssign;
impl<const X: u32, const Y: u32, T: Bits>
BitAndAssign<&BitSet<Y, T>>
for BitSet<X, T>
where
[(); bslen(X, T::BITS)]:,
[(); bslen(Y, T::BITS)]:
{
fn bitand_assign(&mut self, other: &BitSet<Y, T>) {}
}
但是當我嘗試將其更改為使用Borrow<BitSet<Y, T>>而不是&BitSet<Y, T>,如下所示:
use std::ops::BitAndAssign;
use std::borrow::Borrow;
impl<const X: u32, const Y: u32, T: Bits, BSY: Borrow<BitSet<Y, T>>>
BitAndAssign<BSY>
for BitSet<X, T>
where
[(); bslen(X, T::BITS)]:,
[(); bslen(Y, T::BITS)]:
{
fn bitand_assign(&mut self, other: BSY) {}
}
我收到一個錯誤:
error[E0207]: the const parameter `Y` is not constrained by the impl trait, self type, or predicates
--> src/minrep.rs:22:26
|
22 | impl<const X: u32, const Y: u32, T: Bits, BSY: Borrow<BitSet<Y, T>>>
| ^ unconstrained const parameter
|
我不確定這意味著什么,因為Y受到限制,或者為什么它只發生在第二種情況下。generic_const_exprs是不穩定的,所以這可能只是一個編譯器錯誤,但我想我應該問一下,以防萬一有一些明顯或不那么明顯的東西我遺漏了。
uj5u.com熱心網友回復:
一種BSY型別可以實作Borrow<BitSet<Y, T>>多個s Y。在這種情況下,僅僅知道BitSet<X, T>implementsBitAndAssign<BSY>是不足以讓編譯器推斷出的值,Y因為有多個選項。
這就是編譯器抱怨Y不受約束的原因——考慮到特征的型別BitSet<X, T>及其實作BitAndAssign<BSY>(對于特定型別BSY),編譯器不一定能確定Y. 另一方面,給定特征的型別BitSet<X, T>及其實作BitAndAssign<&BitSet<Y, T>>,編譯器確切地知道Y要使用的值,因為它存在于特征定義中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/435077.html
下一篇:如何將匿名物件傳遞給通用函式?
