Jeśli mam tej klasy wartość:W takich przypadkach klasa wartości Scala będzie "zapakowana", prawda?
class ActionId(val value: Int) extends AnyVal
Następnie, we wszystkich przykładach poniżej, obiekt zostanie przydzielony do klasy wartość? (To będzie być „zapakowane” - to będzie nie prostu odwinąć do zwykłego 32-bitowej liczby całkowitej, prawda?)
Funkcja, która zwraca klasę jakości - klasa wartość ucieka zakresu i więc być "zapakowane"?
def someFunction(): ActionId = { ... return ActionId(123) }
funkcję zwracającą obiektu z klasy członka wartości - klasa wartość ucieka zakresu i stąd być „zapakowane”?
case class Post(id: ActionId, ...) { ... } def someFunction(): Post = { ... val somePost = Post(ActionId(123), ...) // ActionId will be "boxed", right? return somePost }
Nawet jeśli obiekt z członkiem klasy wartość jest nie wrócił (tak naprawdę nie uciec zakres), klasa wartość będzie nadal „zapakowane”, gdy stosuje się go jako członek innej klasy (jako pole w klasie
Post
, w tym przykładzie)?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)? }
Wiąże się z tym this answer, który mówi, że gdy klasa wartość nie uciec zakres, to faktycznie są wstawiane. Odwołuje się do dokumentu procesu poprawy Scala SIP-15 po więcej szczegółów. O ile jednak mogę powiedzieć, że SIP-15 w rzeczywistości nie wspomina o tym, że instancja klasy wartości, która nie mieści się w zakresie, będzie "pudełkowa". Sądzę jednak, że wydaje się rozsądne, że musiałoby to być "pudełko". (Dlaczego SIP nie stwierdza wyraźnie, że będzie to pudełko, jeśli ucieknie?)
Czy możesz wyobrazić sobie obsługę bibliotek, aby zmniejszyć obciążenie składniowe podczas pracy z tablicami? – ziggystar
@ziggystar - Cóż, teraz wszystko, co zmniejsza obciążenie składniowe, zwiększa obciążenie związane z bajtem. Jest to więc trudna gra. Gdy jest to ważne, możesz mieć klasę wartości, która owija tablicę i wykonuje ją za ciebie (z bardzo minimalnym obciążeniem składniowym), ale nie jestem pewna sposobu na zrobienie trywialnej fabryki, która przy danej klasie wartości tworzy odpowiednią tablicę klasa wartości. Myślę, że makra ostatecznie się tam dostaną. –
@RexKerr, więc czy to oznacza, że nie ma żadnych klas wartości w strukturach danych? Innymi słowy, Lista, Mapa itp. Zawsze będą tworzyć instancję klasy pudełkowej? –