【问题标题】:How to call `min` on a generic type that could be either an integer or float?如何在可以是整数或浮点数的泛型类型上调用“min”?
【发布时间】:2016-06-26 17:43:49
【问题描述】:

当我想对整数和浮点数调用 min 时该怎么办?例如考虑一下:

fn foo<T>(v1: T, v2: T)
    where ???
{
   ....
   let new_min = min(v1, v2);
   ....
}

问题是min 不适用于f32。花车有another min

我该如何解决这个问题?

【问题讨论】:

  • foo 传递一个或多个NaNs 时,你想要什么结果?
  • @Shepmaster 我不知道,我猜Float处理Nans和Infs的方式相同。

标签: rust


【解决方案1】:

创建您自己的特征来定义各种类型的行为:

trait Min {
    fn min(self, other: Self) -> Self;
}

impl Min for u8 {
    fn min(self, other: u8) -> u8 { ::std::cmp::min(self, other) }
}

impl Min for f32 {
    fn min(self, other: f32) -> f32 { f32::min(self, other) }
}

fn foo<T>(v1: T, v2: T)
    where T: Min
{
   let new_min = Min::min(v1, v2);
}

作为other places 中的mentioned,浮点比较are hard

对于min(NaN, 0.0) 的结果应该是什么,没有一个答案,因此由您决定。如果您确定NaN 小于或大于所有其他数字,那太好了!也许它等于零!也许你应该断言永远不会有NaN...

【讨论】:

  • 注意:对于实现Ord的任何类型,可能值得演示如何自动实现Min;它比枚举所有整数类型要简单。
  • @MatthieuM。我们不会遇到conflicting trait implementations 吗?至少在专业化之前...
  • 啊!我误解了。当OP声明“不起作用”时,我认为min(和Ord)没有为f32实现。既然他们是,确实你需要专业化......
  • 既然已经实现了专业化——不,专业化不会解决冲突的特质问题(如f32: !Ord),你还需要mutually exclusive traits。 @MatthieuM。
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多