В случае закрытий Scala когда захваченные переменные начинают жить в куче JVM?

Связанный вопрос:Scala замыкания по сравнению с внутренними классами Java -> финал VS вар

Интересно, когда Scala делает переменные, захваченные в замыкание, живыми в куче, а не в стеке. Я'Я читаю книгу Скалы Мартина Одерского, но пока я ненайти эту информацию Может кто-нибудь объяснить, чтоза капотом?

Ответы на вопрос(2)

Решение Вопроса

вляется объектом (экземпляромFunction*). Когда он создается, захват значений выполняется путем копирования значений во внутренние поля объекта функции. В теле функции (то есть в объекте функцииapply метод) доступ к захваченным значениям осуществляется путем доступа к этим полям.

Захват vars аналогичен, за исключением того, что компилятор должен добавить уровень косвенности: доступ к значению var осуществляется через некоторый скрытый изменяемый держатель (просто объект с изменяемым полем, указывающим на текущее значение переменной var), и это так держатель, который копируется в объект функции. При записи в var (либо по локальному коду, либо по объекту функции), этополе, которое написано. Этот механизм гарантирует, что локальный код и функциякод манипулирует одними и теми же данными, и оба видят друг другас модификациями.

Таким образом, ответ заключается в том, что как захваченные значения val, так и захваченные переменные всегда живут в куче (либо непосредственно как поле объекта функции, либо как поле некоторого объекта-оболочки).

 Luigi Plinge11 окт. 2012 г., 09:28
Я могу'не вижу ни одного из этих полей, если я бегуjavap -p Test$$anonfun$1.class (анонимная функция в объектеTest) - есть идеи почему бы и нет?
 Luigi Plinge11 окт. 2012 г., 09:55
-p и -private одинаковы. Я'Мы разместили пример здесь:pastebin.com/AkaR6zjM который показывает нет приватных полей.
 Sebastien Lorber11 окт. 2012 г., 12:35
То есть вы имеете в виду, что захват переменных в Scala - это что-то вроде использования окончательного ValueHolder во внутреннем классе Java, на котором мы производим мутации?
 Régis Jean-Gilles11 окт. 2012 г., 10:36
Мой ответ был о закрытии по локальным областям значений и переменным, или другими словами, я касался только функций, определенных в другом методе / функции, например, при вызове foreaach и доступе к локальной области видимости в теле). Это, безусловно, тот случай, о котором говорил @Sebastien Lorber, учитывая упоминание «стек против кучи». В вашем примере оберните 3 строки кода внутри "тестовое задание" метод и проверьте еще раз.
 Régis Jean-Gilles11 окт. 2012 г., 09:44
Добавьте опцию -private, чтобы увидеть приватные поля
 Régis Jean-Gilles11 окт. 2012 г., 13:56
Точно. С той важной разницей, что в Scala это внутренняя деталь реализации, вы нене нужно делать это вручную и загрязнять ваш код.

но вот как это можно сделать. Для каждой локальной переменной компилятор поддерживает флаг, инициализированный как false. Всякий раз, когда используется переменная, компилятор проверяет, используется ли она внутри класса или замыкания, которое не 't содержит переменную 'декларация с; если это так, флаг установлен в значение true. В конце переменнойЕсли в поле установлен флаг false, переменная может находиться в стеке. В противном случае он должен жить в куче.

Ваш ответ на вопрос