Size: a a a

Scala User Group

2020 January 10

AO

Alexey Otts in Scala User Group
Эээээ, ну если так рассуждать то ни у каких методов нет тайп параметров
источник

AO

Alexey Otts in Scala User Group
Только у типов
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Я не рассуждаю, я рассказываю, как сейчас работает.
На момент тайпчека нет никакой информации, что вызов конверсии будет устранён, мало того, он и в байткоде останется
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Т.е.
implicit class FooOps[A](foo: Foo[A])
extends AnyVal{
  def bar[B]


Будет превращать
foo.bar
во что-то вроде

FooOps.bar(FooOps(foo))
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Аллокации не будет, но вызов конверсии останется
источник

AO

Alexey Otts in Scala User Group
Oleg ℕizhnik
Т.е.
implicit class FooOps[A](foo: Foo[A])
extends AnyVal{
  def bar[B]


Будет превращать
foo.bar
во что-то вроде

FooOps.bar(FooOps(foo))
падажжи, FooOps() то с херали там останется?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Alexey Otts
падажжи, FooOps() то с херали там останется?
Ну вот так работает конверсия
источник

Oℕ

Oleg ℕizhnik in Scala User Group
имплисит класс энивал не отличается от не энивала с точки зрения компилятора
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Он сгенерирует метод, который вызывает конструктор
источник

Oℕ

Oleg ℕizhnik in Scala User Group
А сам конструктор уже будет устранён на следующей стадии
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Поэтому для тайпчекера вообще неизвестно, что тут не будет промежуточного объекта
источник

Oℕ

Oleg ℕizhnik in Scala User Group
И списки параметров для тайпчекера останутся списками разных методов
источник

Oℕ

Oleg ℕizhnik in Scala User Group
@sugakandrey рассуди нас
источник

AO

Alexey Otts in Scala User Group
FooOps.bar(FooOps(foo))

Вот тут получается, что в реализации статического метода вызывается метод класса, но насколько я помню из байткода, всё наоборот, внутри метода класса делается вызов статического метода
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Alexey Otts
FooOps.bar(FooOps(foo))

Вот тут получается, что в реализации статического метода вызывается метод класса, но насколько я помню из байткода, всё наоборот, внутри метода класса делается вызов статического метода
тут ничего не говорится про реализацию никакого статического метода
источник

ЮБ

Юрий Бадальянц in Scala User Group
Я короче спросил в дотти гиттере. Я думаю, это просто ещё не сделано
источник

ЮБ

Юрий Бадальянц in Scala User Group
Хотя ошибка намекает, что так и задумано
источник

M

Mikhail in Scala User Group
Oleg ℕizhnik
Т.е.
implicit class FooOps[A](foo: Foo[A])
extends AnyVal{
  def bar[B]


Будет превращать
foo.bar
во что-то вроде

FooOps.bar(FooOps(foo))
implicit class FooOps[A](protected val foo: Foo[A]) extends AnyVal {
 def map[B](f: A => B): B = ???
}

даст
p
ublic final <B extends java.lang.Object, A extends java.lang.Object> B map$extension(TestApp$Foo<A>, scala.Function1<A, B>);
оно не принимает фуопс. только сам фу и f
источник

Oℕ

Oleg ℕizhnik in Scala User Group
источник

M

Mikhail in Scala User Group
теперь посмотри строку 28 и :javap maccc/Foo$FooOps$
источник