2014-07-21 34 views
5

我觉得这是特别有用的模式,允许方法重载:使用特征和泛型函数在防锈中重载函数有什么缺点吗?

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); 
} 

有任何有意义的缺点这样做呢?

+1

如果您的“重载”功能需要在可以做的对象上操作,请使用特征。否则,你可能会更好地执行更早的投射或使用多个功能。 – Ryan

+1

你甚至可以疯狂:双派遣。检查一下,Rust如何完成散列。 – sellibitze

回答

1

不,没有缺点;这正是在Rust中实现超载的模式。

标准库中有许多类型可以做到这一点。例如path模块中有BytesContainer特征,用于各种字符串和向量。

4

至少一个缺点:它不能是一个事后。

在C++中,ad-hoc重载允许你重载一个你无法控制的函数(认为是第三方),而在Rust中这实际上并不可行。这就是说,临时重载在C++中主要是有用的,因为临时模板是唯一你不能预先知道调用将最终解决的函数的地方。在Rust中,由于模板受到特征的约束,所以重载不可能是事后的问题,因为只有特征函数可以被调用,所以这不是问题。

相关问题