Scala で名前による呼び出しパラメーターを使用することについて少し混乱しています。ここで何が起こっているのかを理解するのを手伝ってください。call-by-name パラメーターを使用する次の例を検討してください。
def param = {println("Param evaluates"); 40}
def lazyEval(x: => Int) = {
println("lazy");
x
}
val s = lazyEval(param + 2)
// s = 42
これについて互いに関連するいくつかの質問があります。
lazyEval
メソッドは type のパラメーターを期待する=> Int
のに、なぜparam + 2
操作が合法なのですか? メソッドを呼び出すときに=> Int
、型を持つオブジェクトに整数 2 を追加できるのはなぜですか? IDEが私に示唆しているように、関数は(一体何?)の代わりに型のパラメータを期待しています。<function0>
lazyEval
lazyEval
Int
=> Int
コールバック タイプを
=> Int
から() => Int
コードに変更した後、コンパイルされないのはなぜですか? これは2種類の違いですか?短いバージョン ('=> Int') は単なる構文糖衣だと思います。コードでいくつか遊んだ後、最終的にコードを変更して、でコンパイルできるようにしました
() => Int
。この方法は私にとってより直感的です。
.
def param = {println("Param evaluates"); 40}
def lazyEval(x: () => Int) = { // changed type to '() => Int'
println("lazy");
x() // explicitly calling function using parentheses '()'
}
val s = lazyEval(param _) // adding underscore after method name and removing `+2`
=> Int
このバージョンと最初のバージョン (コールバックタイプあり)の違いは何ですか? 2
このバージョンでは、値とparam
関数 (つまり this lazyEval(param _ + 2)
)を使用して整数を加算できないのはなぜですか? そして、メソッド名の後のアンダースコアはどういう意味ですか? (戻り値ではなく、メソッド自体を渡すために使用されていたと思います)
助けてくれてありがとう