为什么具有const泛型布尔值的方法不能调用为true和false实现的方法?



这段代码运行完美(操场):

struct MyStruct<const B: bool>;
impl MyStruct<false> {
pub fn bar() {
println!("false");
}
}
impl MyStruct<true> {
pub fn bar() {
println!("true");
}
}
impl MyStruct<false> {
pub fn foo() {
MyStruct::<false>::bar()
}
}
impl MyStruct<true> {
pub fn foo() {
MyStruct::<true>::bar()
}
}
fn main() {
MyStruct::<false>::foo();
MyStruct::<true>::foo();
}

结果是:

false
true
另一方面,这段代码将失败(playground):
struct MyStruct<const B: bool>;
impl MyStruct<false> {
pub fn bar() {
println!("false");
}
}
impl MyStruct<true> {
pub fn bar() {
println!("true");
}
}
impl<const B: bool> MyStruct<B> {
pub fn foo() {
MyStruct::<B>::bar()
}
}
fn main() {
MyStruct::<false>::foo();
MyStruct::<true>::foo();
}

导致:

error[E0599]: no function or associated item named `bar` found for struct `MyStruct<B>` in the current scope
--> src/main.rs:16:24
|
1  | struct MyStruct<const B: bool>;
| ------------------------------- function or associated item `bar` not found for this
...
16 |         MyStruct::<B>::bar()
|                        ^^^ function or associated item not found in `MyStruct<B>`
|
= note: the function or associated item was found for
- `MyStruct<false>`
- `MyStruct<true>`

在无限值类型的情况下我可以理解这个错误,但是为什么对于布尔值呢?

有办法克服这个吗?

必须使用特征和通用类型条件反射(playground):

struct MyStruct<const B: bool>;
trait Bar {
fn bar();
}
impl Bar for MyStruct<false> {
fn bar() {
println!("false");
}
}
impl Bar for MyStruct<true> {
fn bar() {
println!("true");
}
}
impl<const B: bool> MyStruct<B>
where
MyStruct<B>: Bar,
{
pub fn foo() {
MyStruct::<B>::bar()
}
}
fn main() {
MyStruct::<false>::foo();
MyStruct::<true>::foo();
}

当然,这个原则也可以推广到bool(playground)以外的其他类型:

struct MyStruct<const U: usize>;
trait Bar {
fn bar();
}
impl Bar for MyStruct<0> {
fn bar() { println!("0"); }
}
impl Bar for MyStruct<1> {
fn bar() { println!("1"); }
}
impl Bar for MyStruct<100> {
fn bar() { println!("100"); }
}
impl<const U: usize> MyStruct<U> where MyStruct<U> : Bar {
pub fn foo() { MyStruct::<U>::bar() }
}
fn main() {
MyStruct::<0>::foo();
MyStruct::<1>::foo();
MyStruct::<100>::foo();
}

playground

struct MyStruct<const B: bool>;
impl MyStruct<false> {
pub fn bar() {
println!("false");
}
}
impl MyStruct<true> {
pub fn bar() {
println!("true");
}
}
impl<const B: bool> MyStruct<B> {
pub fn foo() {
if B {
MyStruct::<true>::bar()
} else {
MyStruct::<false>::bar()
}
}
}
fn main() {
MyStruct::<false>::foo();
MyStruct::<true>::foo();
}

相关内容

  • 没有找到相关文章

最新更新