为什么具有 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>`

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

有没有办法克服这个问题?

回答

必须使用 trait 和泛型类型调节(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();
}

以上是为什么具有 const 泛型布尔值的方法不能调用对 true 和 false 都实现的方法?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>