为什么具有 const 泛型布尔值的方法不能调用为 true 和 false 实现的方法?
Why can a method with a const generic boolean not call a method that is implemented for both true and false?
此代码完美运行 (playground):
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();
}
此代码完美运行 (playground):
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();
}