在我的情况下,我想要一个标志来控制函数应该使用哪个运算符,我计划这样的事情:
val includeValue = *some value*
val include = _ => _
val exclude = _ > _
val operation = if (includeValue) include else exclude
这可能吗?
答案 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
特征,但使用此表示法会变得相当混乱。