惯用的 Scala:不,你不能。您已经明确表示第一个论点不再相关。如果编译器可以让它完全消失,那是最好的:你说你有一个依赖于 int 和 string 的函数,而你没有对生成它的内容做出任何承诺。如果您确实需要该值,但您也确实需要传递 2 参数函数,则可以手动完成:
class Function2From3[A,B,C,Z](f: (A,B,C) => Z, val _1: A) extends Function2[B,C,Z] {
def apply(b: B, c: C) = f(_1, b, c)
}
val lowerDoStuff = new Function2From3(doStuff _, 3)
现在,当您稍后获取该函数时,您可以进行模式匹配以查看它是否为 Function2From3,然后读取该值:
val f: Function2[Int,String,Unit] = lowerDoStuff
f match {
case g: Function2From3[_,_,_,_] => println("I know there's a "+g._1+" in there!")
case _ => println("It's all Greek to me.")
}
(如果它是一个整数对您很重要,您可以将A
其作为通用参数删除并使其_1
成为一个整数 - 并且可能只是lower
在您使用它时调用它)。
反思:不,你不能(一般情况下)。编译器比这更聪明。生成的字节码(如果我们将您的代码包装在 中class FuncApp
)是:
public final void apply(int, java.lang.String);
Signature: (ILjava/lang/String;)V
Code:
0: aload_0
1: getfield #18; //Field $outer:LFuncApp;
4: iconst_3
5: iload_1
6: aload_2
7: invokevirtual #24; //Method FuncApp.doStuff:(IILjava/lang/String;)V
10: return
注意iconst_3
? 那就是你的 3 去的地方——它消失在字节码中。甚至不再有包含该值的隐藏私有字段。