Scala 指向函数的不同重载之一的指针
我尝试了以下方法:Scala 指向函数的不同重载之一的指针,scala,Scala,我尝试了以下方法: def doOperation(op: (Int, Int) => Int) = { op(42, 42) } doOperation(Int.+) 但我得到了以下错误: Error: type mismatch; found : String => String required: (Int, Int) => Int doOperation(Int.+)
def doOperation(op: (Int, Int) => Int) = {
op(42, 42)
}
doOperation(Int.+)
但我得到了以下错误:
Error: type mismatch;
found : String => String
required: (Int, Int) => Int
doOperation(Int.+)
^
这是因为scala中有很多超负荷的
Int:::+
运算符,而编译器不够聪明,无法理解该选择哪一个。Int.+
正在尝试调用上的+
方法。这不存在,因此存在错误。您需要一个函数(Int,Int)=>Int
,可以匿名创建,如下所示:
scala> doOperation((a, b) => a + b)
res9: Int = 84
简言之:
scala> doOperation(_ + _)
res10: Int = 84
Int.+
正在尝试调用上的+
方法。这不存在,因此存在错误。您需要一个函数(Int,Int)=>Int
,可以匿名创建,如下所示:
scala> doOperation((a, b) => a + b)
res9: Int = 84
简言之:
scala> doOperation(_ + _)
res10: Int = 84
首先,Int.+是一个参数方法,因此您应该尝试以下方法:
def doOperation(op: (Int) => Int) = {
op(42)
}
doOperation(Int.+)
要认识到它也不起作用,因为正如@m-z已经解释的,Int.+
是一种尝试引用伴随对象Int
的方法,它只有box
、unbox
方法和两个隐式转换。
但是,您可以尝试对Int的某个实例进行操作,如下所示:
def doOperation(op: (Int) => Int) = {
op(42)
}
val i = 7
doOperation(i.+)
这正如预期的那样有效
旁注。这行不通:
def doOperation(op: (Int) => Int) = {
op(42)
}
val i = 7
val iplus = i.+
doOperation(i.+)
因为
+
是一个重载方法,编译器不知道将哪个方法存储在iplus
变量中。首先,Int.+是一个参数方法,所以您应该尝试以下方法:
def doOperation(op: (Int) => Int) = {
op(42)
}
doOperation(Int.+)
要认识到它也不起作用,因为正如@m-z已经解释的,Int.+
是一种尝试引用伴随对象Int
的方法,它只有box
、unbox
方法和两个隐式转换。
但是,您可以尝试对Int的某个实例进行操作,如下所示:
def doOperation(op: (Int) => Int) = {
op(42)
}
val i = 7
doOperation(i.+)
这正如预期的那样有效
旁注。这行不通:
def doOperation(op: (Int) => Int) = {
op(42)
}
val i = 7
val iplus = i.+
doOperation(i.+)
因为+
是一个重载方法,编译器不知道将哪个方法存储在iplus
变量中