
Oleg
24.05.2017
09:13:24
а если убрать - иногда не будет ,как показали замеры

folex
24.05.2017
09:13:45
я так понимаю, это зависит от использования этого RichInt, а не от его определения

Oleg
24.05.2017
09:13:46
JIT там что-то колдует и сам иногда обнуляет враппинг

folex
24.05.2017
09:13:59
типа если инт под ним (val self: Int) нужно боксить, то будет создан инстанс RichInt

Google

Nick
24.05.2017
09:14:04
вот вопрос в том, как себя скомпилирует еще implicit

folex
24.05.2017
09:14:05
поправьте, если не прав

Oleg
24.05.2017
09:14:33

Nick
24.05.2017
09:16:20
а если сделать implicit def chota(x: Int) = x.toString то по сути будет новое поведение без нового обьекта?

Sergey
24.05.2017
09:16:28
а кто как DI решает у себя? scaldi кто-нибудь юзает? как оно? иль просто имплиситами обходитесь?

Oleg
24.05.2017
09:16:32
если ты запихиваешь в какой-то метод, который делает апкастинг
или в класс, где тип стирается

Nick
24.05.2017
09:16:54
ну понятно

Oleg
24.05.2017
09:17:19
Например, в List[RichInt] всегда будут лежать инстансы обёрток

folex
24.05.2017
09:17:56
но при этом List[Int](1,2,3).map(_.toHexString) не будет

Nick
24.05.2017
09:17:57
а если написать List[Int] и где-то потом дернуть метод из RichInt

Denis
24.05.2017
09:18:08
то ок

Google

Oleg
24.05.2017
09:18:13

Denis
24.05.2017
09:18:22
listInt.map(_.foo)

Nick
24.05.2017
09:18:46

Denis
24.05.2017
09:19:03

Aleksei
24.05.2017
09:19:20

Oleg
24.05.2017
09:19:38

Nick
24.05.2017
09:20:52

Oleg
24.05.2017
09:21:02
у них есть точки, где они успешно юзаются вместе, но нет точек, где они конкурируют

KrivdaTheTriewe
24.05.2017
09:22:06
50 seconds , не будет создавать временный объект , а сделает только операцию умножения 50 * 1000

Grigory
24.05.2017
09:23:30

KrivdaTheTriewe
24.05.2017
09:23:39
Cents(50)

Oleg
24.05.2017
09:23:54
у них есть точки, где они успешно юзаются вместе, но нет точек, где они конкурируют

Nick
24.05.2017
09:23:58
а че Duration эт value class ?

Oleg
24.05.2017
09:25:18
а че Duration эт value class ?
implicit final class DurationInt(val n: Int) extends AnyVal with DurationConversions {
override protected def durationIn(unit: TimeUnit): FiniteDuration = Duration(n, unit)
}
Промежуточный тип, у которого есть методы seconds, minutes, hours - value class

Nick
24.05.2017
09:27:11
пнятненько

KrivdaTheTriewe
24.05.2017
09:27:49
кстати

Google

Oleg
24.05.2017
09:28:00
extends AnyVal ни о чём не говорит?

KrivdaTheTriewe
24.05.2017
09:28:34

Oleg
24.05.2017
09:29:04
да, это и означает value class

KrivdaTheTriewe
24.05.2017
09:29:28
… cannot be extended by another class.
with все портит

Oleg
24.05.2017
09:30:44
она специально сделана для этого
ознакомьтесь с мануалом, пожалуйста http://docs.scala-lang.org/overviews/core/value-classes.html

KrivdaTheTriewe
24.05.2017
09:31:22
ок, тогда сорямба,и спасибо за пояснение

Борис
24.05.2017
09:37:15
из скаладоки: "Universal traits allow basic inheritance of methods for value classes, but they incur the overhead of allocation."
то есть они все таки форсят инастанцирование, или это что-то другое значит?

KrivdaTheTriewe
24.05.2017
09:38:10
получается что форсят , завалили Голиафа

Nick
24.05.2017
09:39:25
что значит форсят?

Ivan
24.05.2017
09:40:06
насильно продвигают
типо того

KrivdaTheTriewe
24.05.2017
09:40:19

Oleg
24.05.2017
09:44:31
если бы метод универсального трейта не ссылался на this, проблем не было бы, как мне кажется

Denis
24.05.2017
10:39:47
получается при наследовании unversal trait создание инcтанса будет только при вызове метода universal trait

Daniel
24.05.2017
10:52:39
тоже с нюансом
если метод переопределить во враппере то используется статический метод и инстанциирования нет

Google

Nikolay
24.05.2017
10:56:16

Daniel
24.05.2017
11:02:45
в таком же виде как сейчас потребуется проходить по всем сорцам и реагировать на инстансы класса
это не для макросов, а для отдельной тулзы (такая уже есть)

Oleg
24.05.2017
11:09:15

Denis
24.05.2017
11:11:57
trait Uni extends Any {
def self: Int
def foo: Unit = println(self)
}
implicit class Bar(self: Int) extends AnyVal with Uni
1.foo // Создаст?
Мне просто интересно тогда что значит та строчка в доках или я что то пропустил

Oleg
24.05.2017
11:12:45
ща проверб

Daniel
24.05.2017
11:12:54
trait Printable extends Any {
def print(): Unit = println("sfafa")
}
class Wrapper(val underlying: Int) extends AnyVal with Printable
object M {
def main(args: Array[String]) = {
val w = new Wrapper(3)
w.print()
}
}
вполне создает
public void main(java.lang.String[]);
Code:
0: iconst_3
1: istore_2
2: new #16 // class Wrapper
5: dup
6: iload_2
7: invokespecial #19 // Method Wrapper."<init>":(I)V
10: invokevirtual #22 // Method Wrapper.print:()V
13: return

Denis
24.05.2017
11:13:24
туплю )

Oleg
24.05.2017
11:13:48

Daniel
24.05.2017
11:14:02
если метод переопределять в value class то не создает

Denis
24.05.2017
11:14:04
создаёт ^(
а какой кейс ты проверял что не создавал?

Oleg
24.05.2017
11:14:55

Daniel
24.05.2017
11:15:54
trait Printable extends Any {
def print(): Unit = println("sfafa")
}
class Wrapper(val underlying: Int) extends AnyVal with Printable {
override def print(): Unit = println("sfafa")
}
object M {
def main(args: Array[String]) = {
val w = new Wrapper(3)
w.print()
}
}
превращается в
public void main(java.lang.String[]);
Code:
0: iconst_3
1: istore_2
2: getstatic #19 // Field Wrapper$.MODULE$:LWrapper$;
5: iload_2
6: invokevirtual #23 // Method Wrapper$.print$extension:(I)V
9: return

Oleg
24.05.2017
11:19:58
подключаюсь через JMX
вот так ничего не инстанцирует
trait MyDescr extends Any{
def self: Long
def descr = self % 3
}

Nick
24.05.2017
11:21:32

Oleg
24.05.2017
11:21:46
Ник отличный шутник
Так что, я полагаю, можно ссылаться на self в univarsal trait безопасно

Google

Daniel
24.05.2017
11:22:25
лан, в этот раз немножко смешно получилось)

Oleg
24.05.2017
11:22:42
Но лучше бы бросали ворнинги компиляции

Daniel
24.05.2017
11:22:53

Oleg
24.05.2017
11:24:05
т.е. сам класс выглядит так
implicit class DescrOps(val self: Long) extends AnyVal with MyDescr

Daniel
24.05.2017
11:24:49
в плане применимости да
я о причинах инстанциирования говорю

Oleg
24.05.2017
11:25:50
ну, в общем, выяснили, что юниверсал трейт не подразумевает инстанцирование даже при использовании методов из валью класса, осталось понять, что значит incur в их доке. Вероятно то, что очень легко споткнуться о боксинг

Daniel
24.05.2017
11:28:10
погодь
trait MyDescr extends Any {
def self: Long
def descr = self % 3
}
class DescrOps(val self: Long) extends AnyVal with MyDescr
object M {
def main(args: Array[String]) = {
val d = new DescrOps(3)
d.descr
()
}
}
тадамс
public void main(java.lang.String[]);
Code:
0: ldc2_w #15 // long 3l
3: lstore_2
4: new #18 // class DescrOps
7: dup
8: lload_2
9: invokespecial #21 // Method DescrOps."<init>":(J)V
12: invokevirtual #25 // Method DescrOps.descr:()J
15: pop2
16: return

Oleg
24.05.2017
11:29:27
def main(args: Array[String]): Unit = {
var i = 0L
while (true) {
i += i.descr
}
}

Daniel
24.05.2017
11:32:17
что измениться должно?
public void main(java.lang.String[]);
Code:
0: lconst_0
1: lstore_2
2: lload_2
3: new #16 // class MyDescr$DescrOps
6: dup
7: getstatic #21 // Field MyDescr$.MODULE$:LMyDescr$;
10: lload_2
11: invokevirtual #25 // Method MyDescr$.DescrOps:(J)J
14: invokespecial #28 // Method MyDescr$DescrOps."<init>":(J)V
17: invokevirtual #32 // Method MyDescr$DescrOps.descr:()J
20: ladd
21: lstore_2
22: goto 2

Oleg
24.05.2017
11:36:15
да, у меня тоже new
интересно, вероятно, JIT включается

Daniel
24.05.2017
11:38:02
JIT заранее не предскажешь, не стоит особо полагаться
зато работает вот так
implicit class DescrOps(val self: Long) extends AnyVal with MyDescr {
override def descr = super.descr
}
ощущение, что надо заоверрайдить всё

Oleg
24.05.2017
11:39:17
Ну, значит, как Денис сказал
зачем они вообще нужны эти юниверсал трейты тогда

Daniel
24.05.2017
11:41:16
подозреваю, что реализовали как смогли
в багтрекере почти все открытые ишью на тему value class о крашах)
override def descr = super.descr
для этого уже в теории можно макрос написать))
с другой стороны странно, если нет переопределения метода (определить это можно, так как для AnyVal наследников нет), то что мешает реализовать сразу оптимальный вариант

Nick
24.05.2017
11:48:23