我发现这是允许方法重载的特别有用的模式:
struct Foo {
value:uint
}
trait HasUIntValue {
fn as_uint(self) -> uint;
}
impl Foo {
fn add<T:HasUIntValue>(&mut self, value:T) {
self.value += value.as_uint();
}
}
impl HasUIntValue for int {
fn as_uint(self) -> uint {
return self as uint;
}
}
impl HasUIntValue for f64 {
fn as_uint(self) -> uint {
return self as uint;
}
}
#[test]
fn test_add_with_int()
{
let mut x = Foo { value: 10 };
x.add(10i);
assert!(x.value == 20);
}
#[test]
fn test_add_with_float()
{
let mut x = Foo { value: 10 };
x.add(10.0f64);
assert!(x.value == 20);
}
这样做有什么有意义的缺点吗?
答案 0 :(得分:4)
至少有一个缺点:它不能是事后的想法。
在C ++中,ad-hoc重载允许你重载一个你无法控制的函数(想想第三方),而在Rust中这实际上并不可行。
话虽这么说,ad-hoc重载在C ++中最常用,因为ad-hoc模板,这是你不能事先知道调用将最终解决的功能的唯一地方。在Rust中,由于模板受特征约束,因此只有特征函数才能被调用,因此重载不能成为事后的事实并不是问题。
答案 1 :(得分:1)
不,没有缺点;这正是在Rust中实现重载的模式。
标准库中有许多类型可以完成此操作。例如,BytesContainer模块中有path个特征,它是针对各种字符串和向量实现的。