我觉得这是特别有用的模式,允许方法重载:使用特征和泛型函数在防锈中重载函数有什么缺点吗?
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);
}
有任何有意义的缺点这样做呢?
如果您的“重载”功能需要在可以做的对象上操作,请使用特征。否则,你可能会更好地执行更早的投射或使用多个功能。 –
Ryan
你甚至可以疯狂:双派遣。检查一下,Rust如何完成散列。 – sellibitze