2011-11-22 72 views
4

是否可以写类似于:在Scala中可以进行方法参数转发吗?

def foo(x: Int, y: Double) 

def bar(x: Int, y: Double) = foo(_) 

我想避免重复自己在说:

def foo(x: Int, y: Double) 

def bar(x: Int, y: Double) = foo(x, y) 

所以在情况下这两个参数列表是相同的类型和大小和参数的重新定位都不应该发生,像参数转发这样的事情能够实现吗?

回答

10

是的,如果功能条所做的无非就是在准确转发到foo等,你可以做到以下几点:

def foo(x : Int, y : Double) { println("X: " x + " y: " + y) } 
def bar = foo _ 

bar(1,3.0) 
//prints out "X: 1 y: 3.0" 

在这种情况下,下划线表示要返回功能foo本身,而不是调用它并返回reuslt。这意味着当调用bar时,它将简单地返回函数foo,然后使用您提供的参数调用该函数。

3

是的,但它是一个有点一语双关

def foo(x: Int, y: Double):Int = 3 

def bar = foo(_, _) 

在这种情况下栏是不是采取一个int和双方法。相反,它是一个没有参数的方法,返回一个函数,它接受一个double并且int。从呼叫者的角度来看,这些可以互换使用。

bar(3, 5.9) // expands to bar apply(3, 5.9), which calls foo 
相关问题