2014-01-23 193 views
1

我想将函数作为参数传递,但该函数有多个参数(其中之一是函数)。scala - 传递函数将另一个函数作为参数

这里是我想在一个基本的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) 

我在这斯卡拉尝试是以下几点:

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 _)更换我的主要方法的机构,它给了我一个类型不匹配错误

类型不匹配;发现:(字符串,字符串,(任意,任意,任意)=>单元)=>所需的单位:(任意,任意,任意)=> 单位

任何想法是怎么回事?

回答

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) 
} 
+0

所以实际的程序我会做有7个函数使用另一个函数作为参数,它们都嵌套在我的示例代码的样式中。我猜想保持Python程序的风格在Scala中并不实际? – kevin

+0

@kevin - 是的,传递嵌套的回调会很快变得丑陋。如果你想做一些异步操作,你可以看看期货。否则为理解和宏可以用来扁平你的代码的语法结构。 – Lee

+0

我继续接受你的回答,因为它解决了我的问题。是否有任何示例可以指示我使用宏来帮助? – kevin

相关问题