scala:具有可变长度参数的Function对象的特征?

时间:2011-04-27 00:33:55

标签: python scala decorator

我正在编写一些scala代码来模拟python装饰器。我正在考虑通过让装饰器扩展一个Function特征来实现它。问题是我希望这个装饰器扩展一个接受任意数量参数的函数,而我能找到的唯一函数特征只允许特定数量的参数,例如: Function1,Function2等

这样的特质存在吗?或者,有没有更好的方法来实现这样的装饰?

编辑:我在scala: memoize a function no matter how many arguments the function takes?更加清楚地重述了这个问题。

3 个答案:

答案 0 :(得分:2)

scala> val bar: (Int*) => Int = {args => args.sum}
bar: (Int*) => Int = <function1>

scala> bar(1,2,3)
res4: Int = 6

不幸的是,你不能在这里使用类型推断:

scala> val bar = {args: Int* => args.sum}
<console>:1: error: ';' expected but identifier found.
       val bar = {args: Int* => args.sum}

答案 1 :(得分:0)

没有功能超级联赛。 您必须将要装饰的方法包装为具有隐式的自己的类。 该课程必须处理不同的方法类型。 然后你必须创建一些生成你的装饰方法的类。

或者如果你能创造出类似的新方法:

def myF(x:Int,y:Int)={x*y}

def myF2(x:Int,y:Int)={myDecorator(myF(x,y))}
def myDecorator[X](f:=>X)={println("entering");val ret=f();println("exiting");ret}

或尝试:

def myF_old(x:Int,y:Int)=x*y 
def paramDecorator(x:Any*):List[Any]={/*do some match operations or something*/} 
def outputDecorator(x:Any*):Any={/*do some match operations or so*/} 
def myF(x:Int,y:Int):Int={
params=paramDecorator(x,y);
val res=myF_old(params(1),params(2));
outputDecorator(res);
}

答案 2 :(得分:0)

我不确定你要完成什么,但是如果你对函数的arity有问题,你可以使用一个使用元组作为输入参数的Function1。由于很容易在任何函数的tupled和unduples版本之间进行转换,这应该不会太不方便。如果你能详细描述你需要的东西,我可以给你一个代码示例。