如何存储" _> _"在斯卡拉的瓦尔?

时间:2015-03-30 21:40:10

标签: function scala

在我的情况下,我想要一个标志来控制函数应该使用哪个运算符,我计划这样的事情:

val includeValue = *some value*

val include = _ => _
val exclude = _ > _

val operation = if (includeValue) include else exclude

这可能吗?

2 个答案:

答案 0 :(得分:3)

如果要为可转换为Comparable的所有类型定义操作,可以使用类似这样的内容:

def exclude[T <% Ordered[T]](a: T, b: T) = a > b
def include[T <% Ordered[T]](a: T, b: T) = a >= b
def operation[T <% Ordered[T]](a: T, b: T) = if (includeValue) include(a, b) else exclude(a, b)

答案 1 :(得分:2)

简而言之,您无法以任何合理的方式将_ > _存储在val中,也可以存储在泛型中。

_ > _表示接受两个参数的函数。它在第一个参数上调用>方法,并将第二个参数作为参数传递给它。我们不能在这里简单地使用通配符类型,因为并非每种类型都有>方法。从这样的未知到未知的功能也没有意义。

我们可以尝试一些简单的方法,比如制作Int => Int

val includeValue = false
val include: (Int, Int) => Boolean = _ >= _
val exclude: (Int, Int) => Boolean = _ > _
val operation = if (includeValue) include else exclude

scala> operation(2, 2)
res72: Boolean = false

// with includeValue = true
scala> operation(2, 2)
res73: Boolean = true

但是您已经通过此实施限制为Int。也许这对你没问题。如果不是,那么您可能想要使用Numeric特征,但使用此表示法会变得相当混乱。