如何在不知道确切类型的情况下在 Rust 中组合特征操作

How to compose trait operations in Rust without knowing the exact type

我正在为自然数 Nat 创建一个简单的特征,并为 u64 创建一个实现。当我使用这个特性并使用一个带有类型注释的操作时,它会找出要使用的实现。但是,当我为复合表达式指定类型时,Rust 无法编译该表达式。

pub trait Nat {
    fn one() -> Self;
    fn succ(self) -> Self;
}

impl Nat for u64 {
    fn one() -> Self { 1 }
    fn succ(self) -> Self { return self + 1; }
}

#[test]
fn test_adder() {
    // Works well
    assert_eq!(4, 3.succ());
    let just_1: u64 = Nat::one();
    assert_eq!(just_1, 1);

    // Doesn't work
    let just_2: u64 = Nat::one().succ();
}

您可以进行指定类型的完全限定调用:

let just_2: u64 = <u64 as Nat>::one().succ();

或者只使用类型本身,让编译器推断特征方法:

let just_2: u64 = u64::one().succ();

Playground