繁体   English   中英

使用特征和泛型函数在rust中重载函数是否有不利之处?

[英]Is there any downside to overloading functions in rust using a trait & generic function?

我发现这对于允许方法重载特别有用:

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

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

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

在C ++中,临时重载允许您重载一个您无法控制的函数(请考虑第三方),而在Rust中,这实际上是不可行的。

就是说,由于ad-hoc模板,临时重载在C ++中最有用,这是您无法预先知道调用最终将解析为哪个函数的唯一位置。 在Rust中,由于模板受特征约束,所以重载不能成为事后考虑的事实并不是问题,因为无论如何只能调用特征函数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM