O aplicativo de função parcial executa prematuramente o bloqueio de código quando usado com sublinhado

Dado:

def save(f: => Any)(run:Boolean) { if (run) { println("running f"); f } else println("not running f") } 

Eu posso chamá-lo com:

save("test")(true) -> running f
save("test")(false) -> not running f
save(throw new RuntimeException("boom!"))(false) -> not running f
save(throw new RuntimeException("boom!"))(true) -> running f and then exception thrown

Aqui está o comportamento curioso com aplicação parcial:

save(throw new RuntimeException("boom!"))(_) -> (Boolean) => Unit = <function1> //as expected
save(throw new RuntimeException("boom!")) _ -> exception thrown

O código de bloqueio é avaliado imediatamente sem ser passado como uma função. Qual é a diferença entre as 2 afirmações acima?

questionAnswers(2)

yourAnswerToTheQuestion