1
Scalaで関数を呼び出すとき、関数の引数は、インスタンス化されるFunctionN型のクラス変数になりますか?Scala関数の引数はクラス変数になりますか?
Scalaで関数を呼び出すとき、関数の引数は、インスタンス化されるFunctionN型のクラス変数になりますか?Scala関数の引数はクラス変数になりますか?
私はFunctionN型がインスタンス化されるため、関数によってあなたは無名関数を意味すると仮定しています。
functionNのapplyメソッドは、ドキュメントごとに "この関数の本体を引数に適用する"関数の引数で呼び出されます。
object Main {
def main(args: Array[String]): Unit = {
def anonFun = (x: Int) => x
anonFun(5)
}
}
あなたが生成されたバイトコードを見ると次のように表示されます:
はこの考えてみましょう
INVOKESPECIAL com/mf/Main$.anonFun$1()Lscala/Function1;
ICONST_5
INVOKEINTERFACE scala/Function1.apply$mcII$sp (I)I
INVOKESPECIALが、その後一定の5がロードされ、無名関数をロードし、 Function1のapplyメソッドが定数と共に呼び出されます。
これは2.11または2.12ですか?どういうわけか、新しいJava8-lambda互換エンコーディングで2.12と違って見えるはずでした。 –
@JörgWMittag2.11で実行しましたが、2.12では私が提示したバイトコードは同じです。違いは2.11です。anonFun $ 1が定義されている新しい匿名クラスが作成されますが、2.12では、Java8のINVOKEDYNAMICがラムダ式の作成に使用されます。つまり、anon関数が呼び出される実際のセクションではなく、異なっています。 –
情報をありがとう! –