gpt4 book ai didi

generics - 我可以避免使用泛型对特征实现进行急切的歧义解决吗?

转载 作者:行者123 更新时间:2023-11-29 07:59:27 26 4
gpt4 key购买 nike

考虑以下 Rust 代码 [ playground ]:

use std::collections::HashMap;
use std::hash::Hash;

trait Foo<K> {
const FOO: i32;
}

impl<K, K_, V> Foo<HashMap<K_, V>> for HashMap<K, V>
where
K: Hash + Eq + Into<K_>,
{
const FOO: i32 = 1;
}

impl<K, V, V_> Foo<HashMap<K, V_>> for HashMap<K, V>
where
K: Hash + Eq,
V: Into<V_>,
{
const FOO: i32 = 2;
}

fn main() {}

(const 不相关,我希望代码也能用 fn 编译)。

编译失败,报错:

error[E0119]: conflicting implementations of trait `Foo<std::collections::HashMap<_, _>>` for type `std::collections::HashMap<_, _>`:
--> src/main.rs:15:1
|
8 | / impl<K, K_, V> Foo<HashMap<K_, V>> for HashMap<K, V>
9 | | where
10 | | K: Hash + Eq + Into<K_>,
11 | | {
12 | | const FOO: i32 = 1;
13 | | }
| |_- first implementation here
14 |
15 | / impl<K, V, V_> Foo<HashMap<K, V_>> for HashMap<K, V>
16 | | where
17 | | K: Hash + Eq,
18 | | V: Into<V_>,
19 | | {
20 | | const FOO: i32 = 2;
21 | | }
| |_^ conflicting implementation for `std::collections::HashMap<_, _>`

据我了解,问题在于这里存在歧义 - 如果两者都是合法的,应该选择哪个实现?理想情况下,我想要以下内容:

  1. 上面的代码(或一些解决方法)应该可以正常编译。
  2. 在调用站点,如果对于给定类型只有一个 impl 可能,则选择那个。
  3. 在调用站点,如果有多个 impl 可能,那么这是一个错误(连贯性问题)。

更简洁地说,我希望在调用站点而不是在定义站点完成歧义解决。是否可能有这种行为?

最佳答案

Can I avoid eager ambiguity resolution for trait implementations with generics?

没有。

Is it possible to have [ambiguity resolution to be done at the call site, rather than at the definition site]?

没有。


有一个(延迟已久的)RFC for specialization这将允许重叠的特征实现,但前提是其中一个比其他的更具体。我不相信这对你的情况是正确的,所以它没有帮助。

另见:

关于generics - 我可以避免使用泛型对特征实现进行急切的歧义解决吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52281091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com