如何在不知道确切类型的情况下在 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();
我正在为自然数 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();