可以參考我寫的 Test.scala 跟 反組譯的結果 Test.jad
結論感覺他是藉由ㄓ實做 scala.Serializable 這個 interface 來實做function傳遞這件事
第一個範例
Scala:
(1 to 9).reduceLeft(_*_)
Java
RichInt$.MODULE$.to$extension0(Predef$.MODULE$.intWrapper(1), 9).
*reduceLeft*(new *Serializable*() {
public final int apply(int x$1, int x$2)
{
return apply$mcIII$sp(x$1, x$2);
}
public int apply$mcIII$sp(int x$1, int x$2)
{
return *x$1 * x$2*; // function 功能
}
public final volatile Object apply(Object v1, Object v2)
{
return
BoxesRunTime.boxToInteger(apply(BoxesRunTime.unboxToInt(v1),
BoxesRunTime.unboxToInt(v2)));
}
public static final long serialVersionUID = 0L;
});
第二個範例 -> Java實做直接簡化了
Scala:
def mulOneAtTime(x: Int)(y: Int) = x * y
mulOneAtTime(6)(7)
Java
public int mulOneAtTime(int x, int y)
{
return x * y;
}
mulOneAtTime(6, 7);
第三個範例
Scala
def until(condition: => Boolean)(block: => Unit)
{
if(!condition)
{
block
until(condition)(block)
}
}
def test_until = // call until
{
var x = 10
until(x == 0)
{
x -= 1
println(x)
}
mulOneAtTime(6)(7)
}
Java
public void until(*Function0 *condition, *Function0 *block)
{
if(!condition.apply$mcZ$sp())
{
block.apply$mcV$sp();
until(condition, block);
}
}
public int test_until()
{
IntRef x = new IntRef(10);
until(new *Serializable*(x) {
public final boolean apply()
{
return apply$mcZ$sp();
}
public boolean apply$mcZ$sp()
{
return x*$3.elem == 0;*
}
public final volatile Object apply()
{
return BoxesRunTime.boxToBoolean(apply());
}
public static final long serialVersionUID = 0L;
private final IntRef x$3;
public
{
this.x$3 = x$3;
super();
}
}, new *Serializable*(x) {
public final void apply()
{
apply$mcV$sp();
}
public void apply$mcV$sp()
{
* x$3.elem = x$3.elem - 1;*
*
Predef$.MODULE$.println(BoxesRunTime.boxToInteger(x$3.elem));*
}
public final volatile Object apply()
{
apply();
return BoxedUnit.UNIT;
}
public static final long serialVersionUID = 0L;
private final IntRef x$3;
public
{
this.x$3 = x$3;
super();
}
});
}
Best Regards,
Mike
--
*方鍾豪 (Mike Fang)*
Pervasive Embedded Technology Lab
Department of Computer Science, National Chiao Tung University
Attachment:
Test.scala
Description: Binary data