使用特征和放大器在生锈中重载功能是否有任何缺点?通用功能?

时间:2014-07-21 04:37:05

标签: 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);
}

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

2 个答案:

答案 0 :(得分:4)

至少有一个缺点:它不能是事后的想法。

在C ++中,ad-hoc重载允许你重载一个你无法控制的函数(想想第三方),而在Rust中这实际上并不可行。

话虽这么说,ad-hoc重载在C ++中最常用,因为ad-hoc模板,这是你不能事先知道调用将最终解决的功能的唯一地方。在Rust中,由于模板受特征约束,因此只有特征函数才能被调用,因此重载不能成为事后的事实并不是问题。

答案 1 :(得分:1)

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

标准库中有许多类型可以完成此操作。例如,BytesContainer模块中有path个特征,它是针对各种字符串和向量实现的。