@scala_ru

Страница 694 из 1499
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
вот вопрос в том, как себя скомпилирует еще implicit
implicit class Foo(x: X)- это просто сахар для implicit def Foo(x: X): Foo = new Foo(x)

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
а если сделать implicit def chota(x: Int) = x.toString то по сути будет новое поведение без нового обьекта?
это не новое поведение, ты просто неявно конвертишь Int в String

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

Nick
24.05.2017
09:18:46
это не новое поведение, ты просто неявно конвертишь Int в String
это ж пример, я могу там вместо x.toString сделать маининг биткоинов

Oleg
24.05.2017
09:19:38
это ж пример, я могу там вместо x.toString сделать маининг биткоинов
просто ты очень активно пытаешься ввести в одно поле рассмотрения extends AnyVal и implicit def, хотя это ортогональные фичи

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

нет, я пытаюсь понять, для чего нужен extends Anyval
тогда перестань упоминать implicit def

KrivdaTheTriewe
24.05.2017
09:22:06
нет, я пытаюсь понять, для чего нужен extends Anyval
для реализации дюрейшенов бесплатно

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

Grigory
24.05.2017
09:23:30
тогда перестань упоминать implicit def
implicit def extends AnyVal with AnyRef // ккомбо

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
пнятненько

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
with все портит
не портит, это universal trait

она специально сделана для этого

ознакомьтесь с мануалом, пожалуйста 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
получается при наследовании unversal trait создание инcтанса будет только при вызове метода universal trait
Интересно, можно scala.meta переписать value class с universal trait-ом, чтобы не было инстанциирования

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

Oleg
24.05.2017
11:09:15
получается при наследовании unversal trait создание инcтанса будет только при вызове метода universal trait
нет, проверил, метод, определённый в universal trait, не инстанцирует, если нет необходимости

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

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

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

Oleg
24.05.2017
11:14:55
а какой кейс ты проверял что не создавал?
trait MyDescr extends Any{ def descr = "descr descr" }

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 }

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
вот так ничего не инстанцирует trait MyDescr extends Any{ def self: Long def descr = self % 3 }
скорее всего то же самое что у меня переопределение почему-то роляет

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
зачем они вообще нужны эти юниверсал трейты тогда
Вот этот вопрос у меня с самого начала

Страница 694 из 1499