Scala: 可变参数函数对象的特质?
我正在写一些Scala代码,想要模拟Python中的装饰器。我考虑通过让这个装饰器扩展一个Function特性来实现这个功能。问题是,我希望这个装饰器能够接受任意数量的参数,而我找到的Function特性似乎只允许特定数量的参数,比如Function1、Function2等等。
有没有这样的特性存在?或者,有没有更好的方法来实现这样的装饰器?
编辑:我重新整理了这个问题,以便更清楚,可以查看 scala: memoize a function no matter how many arguments the function takes?。
3 个回答
0
没有一个叫做“supertrait”的函数。你需要把想要装饰的方法放到一个自己的类里,并使用隐式参数。这个类需要处理不同类型的方法。
然后,你还需要创建一个类来生成你装饰过的方法。
或者,如果可以的话,你可以像这样直接创建新的方法:
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);
}
0
我不太清楚你想要达到什么目的,但如果你在函数的参数数量上遇到问题,可以考虑使用一个叫做Function1的东西,它可以接受一个元组作为输入。其实,把元组和普通参数之间转换是很简单的,所以这样做应该不会太麻烦。如果你能更详细地描述一下你的需求,我可以给你一个代码示例。
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}