Если у меня есть этот класс значений:
class ActionId(val value: Int) extends AnyVal
Тогда во всех приведенных ниже примерах объект будет выделен для класса значений? (Он будет «в штучной упаковке» - он не будет просто развернут в простое 32-битное целое, верно?)
Функция, которая возвращает класс значения - класс значений выходит из области видимости и, следовательно, будет «упакован»?
def someFunction(): ActionId = {
...
return ActionId(123)
}
Функция, которая возвращает объект с членом класса значения - значение класс выходит за рамки видимости и, следовательно, будет «упакован»?
case class Post(id: ActionId, ...) { ... }
def someFunction(): Post = {
...
val somePost = Post(ActionId(123), ...) // ActionId will be "boxed", right?
return somePost
}
Даже если объект с членом класса значения равен , а не возвращается (на самом деле не выходит из области видимости), класс значения будет по-прежнему «упакован», когда он используется в качестве члена другого класса (в качестве поля в классе Post
, в этом примере)?
def anotherFunction() {
...
val somePost = Post(ActionId(123), ...) // "Boxed" here too, right?
// ... do something with somePost
// But don't: return somePost
// However some *other* similar functions *do* return `somePost` — so
// class `Post` must be able to box the ActionId? Hence it's boxed (above)?
}
С этим связан этот ответ , в котором говорится, что , когда класс значений не выходит за рамки , он эффективно встроен. Более подробная информация приведена в документе Процесс улучшения Scala SIP-15 Однако, насколько я могу судить, SIP-15 на самом деле не упоминает, что экземпляр класса значения, выходящий за пределы области действия, будет «упакован». Но я думаю, что кажется разумным, что это должно быть "в штучной упаковке". (Почему SIP явно не заявляет, что он будет упакован, если сбежит?)