使用特征和泛型函数在生锈中重载函数是否有任何缺点?

Dou*_*oug 5 rust

我发现这是允许方法重载的特别有用的模式:

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);
}
Run Code Online (Sandbox Code Playgroud)

这样做有什么有意义的缺点吗?

Vla*_*eev 2

不,没有什么坏处;这正是 Rust 中实现重载的模式。

标准库中有许多类型可以做到这一点。例如,path模块中有BytesContainer特征,它是针对各种字符串和向量实现的。