Проблема в том, что вы думаете о блоках, как о блоках, как о кусочках кода. Это не так. { a; b; c }
- это , а не фрагмент кода, который можно передать.
Итак, как вы должны рассуждать о последствиях? На самом деле, как вы должны рассуждать о представлениях , которые являются неявными преобразованиями. Представления применяются к значению, которое необходимо изменить. В вашем примере значение
{
println(1)
println(2)
}
передается на setRunnable
. Значением блока является значение его последнего выражения, поэтому он передает результат println(2)
в setRunnable
. Так как это Unit
и setRunnable
требует Runnable
, то неявное ищется и обнаруживается, поэтому println(2)
передается грубо названному blockToRunnable
.
Суть в том, и этот совет, который я уже много раз давал о переполнении стека (многие люди пытаются сделать то же самое), заключается в следующем:
THERE ARE NO BLOCKS IN SCALA.
Есть функции, но не блоки.
Технически, это утверждение неверно - в Scala есть блоки, но они не те, о которых вы думаете, поэтому просто полностью удалите их из своего разума. Вы можете узнать, какие блоки в Scala являются последними, с чистого листа. В противном случае вы должны попытаться заставить их работать так, как они этого не делают, или сделать вывод, что все работает определенным образом, когда они работают по-другому.