gpt4 book ai didi

overloading - 我怎样才能近似方法重载?

转载 作者:行者123 更新时间:2023-11-29 07:45:25 24 4
gpt4 key购买 nike

我正在为一个 API 建模,其中方法重载非常适合。我天真的尝试失败了:

// fn attempt_1(_x: i32) {}
// fn attempt_1(_x: f32) {}
// Error: duplicate definition of value `attempt_1`

然后我添加了一个枚举并完成了:

enum IntOrFloat {
Int(i32),
Float(f32),
}

fn attempt_2(_x: IntOrFloat) {}

fn main() {
let i: i32 = 1;
let f: f32 = 3.0;

// Can't pass the value directly
// attempt_2(i);
// attempt_2(f);
// Error: mismatched types: expected enum `IntOrFloat`

attempt_2(IntOrFloat::Int(i));
attempt_2(IntOrFloat::Float(f));
// Ugly that the caller has to explicitly wrap the parameter
}

通过快速搜索,我找到了 found some references谈论重载,所有这些似乎都以“我们不允许这样做,但尝试一下特性”结尾。所以我尝试了:

enum IntOrFloat {
Int(i32),
Float(f32),
}

trait IntOrFloatTrait {
fn to_int_or_float(&self) -> IntOrFloat;
}

impl IntOrFloatTrait for i32 {
fn to_int_or_float(&self) -> IntOrFloat {
IntOrFloat::Int(*self)
}
}

impl IntOrFloatTrait for f32 {
fn to_int_or_float(&self) -> IntOrFloat {
IntOrFloat::Float(*self)
}
}

fn attempt_3(_x: &dyn IntOrFloatTrait) {}

fn main() {
let i: i32 = 1;
let f: f32 = 3.0;

attempt_3(&i);
attempt_3(&f);
// Better, but the caller still has to explicitly take the reference
}

这是我最接近方法重载的方法吗?有更清洁的方法吗?

最佳答案

是的,有,你几乎已经明白了。特征是要走的路,但你不需要特征对象,使用泛型:

#[derive(Debug)]
enum IntOrFloat {
Int(i32),
Float(f32),
}

trait IntOrFloatTrait {
fn to_int_or_float(&self) -> IntOrFloat;
}

impl IntOrFloatTrait for i32 {
fn to_int_or_float(&self) -> IntOrFloat {
IntOrFloat::Int(*self)
}
}

impl IntOrFloatTrait for f32 {
fn to_int_or_float(&self) -> IntOrFloat {
IntOrFloat::Float(*self)
}
}

fn attempt_4<T: IntOrFloatTrait>(x: T) {
let v = x.to_int_or_float();
println!("{:?}", v);
}

fn main() {
let i: i32 = 1;
let f: f32 = 3.0;

attempt_4(i);
attempt_4(f);
}

看到它工作 here .

关于overloading - 我怎样才能近似方法重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25265527/

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