Pull to refresh

Comments 11

Value-классы не выделяют память во время компиляции (вообще это как???), а позволяют делать бесплатные обертки вокруг других типов.

Суть в том, что объект Value-класса не создается, если он никуда не возвращается и не передается. А все методы на нем переписываются компилятором как вызовы методов сопряженного объекта. Тем самым, если у нас есть код:

class Meter(val value: Double) extends AnyVal {
def plus(that: Meter): Meter = new Meter(value + that.value)
}

val x = new Meter(3.4)
val y = new Meter(4.3)
val z = x plus y

println(z.value)

То по сути будет что-то в духе:

class Meter(val value: Double) extends AnyVal {
def plus(that: Meter): Meter = Meter.extension$plus(this.value, that.value)
}

object Meter {
def extension$plus($this: Double, that: Double) = new Meter($this + that)
}

val x = new Meter(3.4) // Если дальше не возвращается, то создания объекта тут нет
val y = new Meter(4.3) // Если дальше не возвращается, то создания объекта тут нет
val z = Meter.extension$plus(3.4, 4.3)

println(z.value) // Насколько я понимаю, тут тоже нет объекта класса Meter

upd. А тэг source тоже с отрицательной кармой не работает чтоль?
upd2. Вот тут SIP: docs.google.com/document/d/10TQKgMiJTbVtkdRG53wsLYwWM2MkhtmdV25-NZvLLMA/edit?hl=en_US
Кроме оберток их еще используют в самой скале как rich примитивы.
Я мало что понимаю в тонкостях работы JVM, так что если здесь действительно что-то не так, пусть кто-нибуть напишет ответ к этому комментарию. На странице об value классах пишет: Value classes are a new mechanism in Scala to avoid allocating runtime objects.
Ну это по сути бесплатные тайп-тэги, тоесть без особой необходимости jvm не будет создавать собственно объекты, а просто будет вызывать статические методы на оборачиваемых значениях. Собственно именно об этом и пишут в документации. Мне в 20 минут первого не кажется, что это статическое выделение памяти.

Плюс если сделать value-класс имплиситом, то все добавленные методы будут работать без создания новых объектов. Что очень приятно.
Но ведь value class оборачивает примитивы, примитивы создаются на стеке, следовательно value классы создаются на стеке.
Почему примитивы? Любые классы.
Вот почему мы друг друга не понимали! Поправил, надеюсь так будет лучше.
UFO just landed and posted this here
Автор:
— «экспоненциальных взрывов» — wtf?

И зачем вообще переводить release notes? Статья была бы ценна, если бы в ней были примеры использования новых фич, более детальное объяснение.

Вот например «Группы (-groups)» — это что? Я думаю, что любой чел мало знакомый с анлгийским это перевести сможет, а вот рассказать что это было бы полезно.
В оригинале «no more exponential blow-up!»

Цель поста — рассказать о том, что вышла новая версия языка программирования. А переводить нужно потому, что статья на хабре по английски выглядела бы, мягко говоря, странно. К тому же, если вы читали оригинальные release notes, то могли заметить, что некоторые примеры и объяснения я все же добавил. К сожалению, я не настолько крут, чтобы рассказывать как делать custom thread pulls для параллельных коллекций или технические подробности нового генератора байт-кода.

Я также не знаю, что это за группы в новом ScalaDoc и нигде не могу найти о них информации.
Sign up to leave a comment.

Articles