Комментарии 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
Суть в том, что объект 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
+2
Кроме оберток их еще используют в самой скале как rich примитивы.
Я мало что понимаю в тонкостях работы JVM, так что если здесь действительно что-то не так, пусть кто-нибуть напишет ответ к этому комментарию. На странице об value классах пишет: Value classes are a new mechanism in Scala to avoid allocating runtime objects.
Я мало что понимаю в тонкостях работы JVM, так что если здесь действительно что-то не так, пусть кто-нибуть напишет ответ к этому комментарию. На странице об value классах пишет: Value classes are a new mechanism in Scala to avoid allocating runtime objects.
0
Ну это по сути бесплатные тайп-тэги, тоесть без особой необходимости jvm не будет создавать собственно объекты, а просто будет вызывать статические методы на оборачиваемых значениях. Собственно именно об этом и пишут в документации. Мне в 20 минут первого не кажется, что это статическое выделение памяти.
Плюс если сделать value-класс имплиситом, то все добавленные методы будут работать без создания новых объектов. Что очень приятно.
Плюс если сделать value-класс имплиситом, то все добавленные методы будут работать без создания новых объектов. Что очень приятно.
0
НЛО прилетело и опубликовало эту надпись здесь
Автор:
— «экспоненциальных взрывов» — wtf?
И зачем вообще переводить release notes? Статья была бы ценна, если бы в ней были примеры использования новых фич, более детальное объяснение.
Вот например «Группы (-groups)» — это что? Я думаю, что любой чел мало знакомый с анлгийским это перевести сможет, а вот рассказать что это было бы полезно.
— «экспоненциальных взрывов» — wtf?
И зачем вообще переводить release notes? Статья была бы ценна, если бы в ней были примеры использования новых фич, более детальное объяснение.
Вот например «Группы (-groups)» — это что? Я думаю, что любой чел мало знакомый с анлгийским это перевести сможет, а вот рассказать что это было бы полезно.
+2
Ошибся веткой, ответ ниже. habrahabr.ru/post/164739/#comment_5674583
0
В оригинале «no more exponential blow-up!»
Цель поста — рассказать о том, что вышла новая версия языка программирования. А переводить нужно потому, что статья на хабре по английски выглядела бы, мягко говоря, странно. К тому же, если вы читали оригинальные release notes, то могли заметить, что некоторые примеры и объяснения я все же добавил. К сожалению, я не настолько крут, чтобы рассказывать как делать custom thread pulls для параллельных коллекций или технические подробности нового генератора байт-кода.
Я также не знаю, что это за группы в новом ScalaDoc и нигде не могу найти о них информации.
Цель поста — рассказать о том, что вышла новая версия языка программирования. А переводить нужно потому, что статья на хабре по английски выглядела бы, мягко говоря, странно. К тому же, если вы читали оригинальные release notes, то могли заметить, что некоторые примеры и объяснения я все же добавил. К сожалению, я не настолько крут, чтобы рассказывать как делать custom thread pulls для параллельных коллекций или технические подробности нового генератора байт-кода.
Я также не знаю, что это за группы в новом ScalaDoc и нигде не могу найти о них информации.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Релиз Scala 2.10