我想将现有函数分配给变量。根据{{3}}网站,它很简单:
val p = scala.math.pow(_, _)
pow: (Double, Double) => Double = <function2>
但是当我尝试在我的代码中执行相同的操作时,它不起作用。
def main(args: Array[String]) = {
val p = scala.math.min(_, _)
val func = if ( args(0).equalsIgnoreCase("min")) math.min(_,_) else math.max(_,_)
}
我认为这可能是由于在同一行中使用if
和else
条件,但在将值赋给变量p
时也会出错。
我得到错误:
缺少扩展函数的参数类型((x $ 1,x $ 2)=&gt; scala.math.min(x $ 1,x $ 2))
为什么它对我不起作用,我该如何解决?
答案 0 :(得分:2)
必须为func
:
val func: (Int, Int) => Int = if (args.head.equalsIgnoreCase("min")) math.min(_,_) else math.max(_,_)
或者如用户dmitry指出的那样,使用单个下划线:
val func = if (args.head.equalsIgnoreCase("min")) math.min _ else math.max _
然而,看起来你是这门语言的初学者 - 我个人会练习明确地说明第一个例子中的兴趣类型,直到你对事情有更好的处理。
答案 1 :(得分:1)
只有一个scala.math.pow
方法,但min
和max
有多个重载:def min(x: Double, y: Double): Double
,def min(x: Int, y: Int): Int
等。没有提供预期的参数类型,Scala不知道你的意思。我会写,例如val p = scala.math.min(_: Int, _: Int)
或val p = scala.math.min(_: Double, _: Double)
(或者您可以直接在Tanjin的答案中指定p
的类型)。
val p = min _
恰好起作用,因为min(x: Int, y: Int)
重载是最具特异性的,但我认为在启动时依赖它是一个坏主意。