impl-weak-traits 技术文档
路径:
components/crate_interface/test_crates/impl-weak-traits类型:库 crate /crate_interfaceweak_default测试矩阵的实现端资产 工作区定位:components/crate_interface/test_crates独立测试工作区中的“强覆盖”样例库 版本:0.1.0文档依据:Cargo.toml、src/lib.rs、components/crate_interface/README.md、components/crate_interface/Cargo.toml、仓库根Cargo.toml、components/crate_interface/test_crates/Cargo.toml、components/crate_interface/test_crates/define-weak-traits/src/lib.rs、components/crate_interface/test_crates/test-weak/src/main.rs、components/crate_interface/tests/test_weak_default.rs、components/crate_interface/test_crates/run_tests.sh、components/crate_interface/.github/workflows/ci.yml
impl-weak-traits 是 crate_interface 弱默认实现测试矩阵里的“实现端强覆盖样例库”。它不是为了给业务代码提供一组带默认值的后端实现,而是为了制造一批可观察的强符号 ,实现 define-weak-traits 中的接口并压过默认弱符号,再由 test-weak 在最终二进制里验证链接器的真实选择结果。
1. 架构设计
1.1 真实定位
crate_interface README 明确指出:带默认实现的接口,其 weak_default 语义本质上是跨 crate 的链接期机制;定义端负责产生弱符号,实现端负责按需产生强符号,最终由链接器决定谁生效。也正因为如此,impl-weak-traits 必须是独立 crate,不能被误解为 define-weak-traits 的“附带实现”。
它在测试矩阵中的位置是:
define-weak-traits负责定义带默认实现的接口,并开启weak_default。impl-weak-traits负责提供“强覆盖”这一半的实现端样本。test-weak负责把它们链接到一起,验证强符号覆盖、部分回退、命名空间和 caller 路径。
1.2 实现矩阵
src/lib.rs 中的 5 个公开实现类型,分别覆盖不同的强弱符号组合情形:
| 实现类型 | 对应接口 | 显式覆写的方法 | 仍使用默认弱符号的方法 | 主要验证点 |
|---|---|---|---|---|
FullImpl | WeakDefaultIf | required_value、required_name、default_value、default_add、default_greeting | 无 | 强符号全面压过弱默认 |
AllDefaultImpl | AllDefaultIf | method_a | method_b、method_c | 同一接口内允许强弱并存 |
NamespacedWeakImpl | NamespacedWeakIf | get_id | get_default_multiplier | namespace 与弱默认可同时成立 |
CallerWeakImpl | CallerWeakIf | compute | default_offset | gen_caller 与弱默认可同时成立 |
SelfRefFullImpl | SelfRefIf | required_id、base_value、transform | derived_value、derived_with_offset、call_via_ref、call_twice | 默认实现内部 Self:: 引用能否跳到强符号 |
这里最重要的不是“实现数量多”,而是覆写粒度被故意设计成不同层次,使测试侧能同时观察到“强覆盖生效”和“未覆写方法继续回退”的混合现象。
1.3 强符号与弱符号的协作方式
这组样例的运行模型来自两端协作:
define-weak-traits依赖启用了weak_default特性的crate_interface