2017-05-01 134 views
0

我想将现有函数分配给变量。据this网站,它是一样简单:将现有函数分配给变量

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)=> scala.math.min(X $ 1,X $ 2))

为什么它不适合我,我该如何解决它?

+1

'val p = scala.math.min _' – dmitry

+0

@dmitry为什么pow需要2个下划线,min和max只能用1来完成?即如何知道1个下划线是否足够? –

+0

我建议在这里阅读最高票数的答案,特别是结尾部分。另外scala.math.pow _单下划线也可以。知道什么是足够的简短答案是看看它是否成功编译:) http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala – Tanjin

回答

2

类型参数必须为func定义:

val func: (Int, Int) => Int = if (args.head.equalsIgnoreCase("min")) math.min(_,_) else math.max(_,_) 

或者作为用户梅德指出,使用单一的下划线:

val func = if (args.head.equalsIgnoreCase("min")) math.min _ else math.max _ 

但是好像你是一个初学者到语言 - 我个人会像第一个例子那样明确地说明感兴趣的类型,直到你对事物有更好的处理。

+0

是,今天开始学习! –

1

只是有一个scala.math.pow方法,但也有minmax多个重载:def min(x: Double, y: Double): Doubledef min(x: Int, y: Int): Int等没有提供预期的参数类型,斯卡拉无法知道你的意思是哪一个。我会写例如val p = scala.math.min(_: Int, _: Int)val p = scala.math.min(_: Double, _: Double)(或者您可以直接指定p的类型,如Tanjin的答案)。

val p = min _恰好工作,因为min(x: Int, y: Int)过载是最具体的过载,但我认为在启动时依赖它是一个坏主意。