我试图将函数作为参数传递,但该函数有多个参数(其中一个是函数)。
以下是我在基本的Python示例中尝试做的事情:
def first(string1, string2, func):
func(string1, string2, third)
def second(string1, string2, func):
func(string1, string2)
def third(string1, string):
# operations go here
first("one", "two", second)
我在Scala的尝试如下:
def first(string1: String, string2: String, func: (Any, Any, Any) => Unit) = {
func(string1, string2, func)
}
def second(string1: String, string2: String, func: (Any, Any) => Unit) = {
func(string1, string2)
}
def third(string1: String, string2: String) = {
// operations
}
def main(args: Array[String]): Unit = {
first("one", "two", second)
}
我在尝试将second
传递给first
并且参数数量不足时收到错误。是否有可能以与Python示例相同的样式实现此功能?
修改
我尝试用first("one", "two", second _)
替换主方法的主体,它给我一个类型不匹配错误
类型不匹配; found:(String,String,(Any,Any,Any)=> Unit)=>所需单位:(任何,任何,任何)=> 单元
知道这里发生了什么吗?
答案 0 :(得分:2)
您尝试做的不是类型安全的。您无法将(String, String, (Any, Any) => Unit) => Unit
分配给(Any, Any, Any) => Unit
。如果可以,那么您可以执行以下操作:
val f = second _
val af: (Any, Any, Any) => Unit = f
af(1, "abc", 5)
如果您更精确地指定类型,则可以执行此操作:
def second(string1: String, string2: String, func: (String, String) => Unit) = {
func(string1, string2)
}
def third(string1: String, string2: String) = {
// operations
}
def first(string1: String, string2: String, func: (String, String, (String, String) => Unit) => Unit) = {
func(string1, string2, third)
}