Size: a a a

Scala User Group

2020 August 01

VE

Vasiliy Efimov in Scala User Group
компиляция может стать медленнее
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Dmitry Zuev
Magnolia
Оч смешно
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Sergey M
Hello everybody
Тема - Reflection

Я тут хочу написать функцию которая достаёт названия полей из класса (и case и обычного тоже)

написал такое

   case class Pers(name: String, age: Int)
   class Car(name: String)

   val p = Pers("Ivan", 2)
   val c = new Car("BMV")

   import scala.reflect.runtime.universe._
   
   def getListOfFields(p: Object): List[String] = {
     val m = runtimeMirror(p.getClass.getClassLoader)

     val symbol = m.classSymbol(p.getClass).typeSignature.typeSymbol.asClass
     val ctor = symbol.primaryConstructor

     val paramList = ctor.typeSignature.paramLists
     paramList.flatten.map(s => s.name.toString)
   }

   getListOfFields(p)
   getListOfFields(c)

//val res3: List[String] = List(name, age)
//val res4: List[String] = List(name)


Это же можно как-то проще написать? А то как-то слишком cumbersome
Но зато так работает
источник

Oℕ

Oleg ℕizhnik in Scala User Group
для кейс класса
источник

SM

Sergey M in Scala User Group
на сколько я помню это появилось в scala 2.13
а у меня 2.11
источник

DZ

Dmitry Zuev in Scala User Group
Oleg ℕizhnik
Оч смешно
А чоу?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Sergey M
на сколько я помню это появилось в scala 2.13
а у меня 2.11
если у кейскласса несколько списков параметров, полями становится только первый, а у вас все выведет
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Dmitry Zuev
А чоу?
написать код на магнолии, который вытаскивает список полей не проще, чем на рефлекшене, на шейплесе - сложнее, чем на рефлекшене
написать макрос, который это будет делать  - так же, как на рефлекшене
но магнолия и шейплес будет работать только для кейсклассов
источник

DZ

Dmitry Zuev in Scala User Group
Oleg ℕizhnik
написать код на магнолии, который вытаскивает список полей не проще, чем на рефлекшене, на шейплесе - сложнее, чем на рефлекшене
написать макрос, который это будет делать  - так же, как на рефлекшене
но магнолия и шейплес будет работать только для кейсклассов
Так нужно для кейсклассов то
источник

SM

Sergey M in Scala User Group
Dmitry Zuev
Так нужно для кейсклассов то
Да
scalapb генерирует final case class
источник

SM

Sergey M in Scala User Group
Oleg ℕizhnik
написать код на магнолии, который вытаскивает список полей не проще, чем на рефлекшене, на шейплесе - сложнее, чем на рефлекшене
написать макрос, который это будет делать  - так же, как на рефлекшене
но магнолия и шейплес будет работать только для кейсклассов
Если это так
Если на shapeless не проще чем на reflection
значит ф-ия кот. я написал вполне нормальная?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Dmitry Zuev
Так нужно для кейсклассов то
В оригинальном вопрос (и case и обычного тоже)
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Sergey M
Если это так
Если на shapeless не проще чем на reflection
значит ф-ия кот. я написал вполне нормальная?
Я ответил, что с ней не так
источник

SM

Sergey M in Scala User Group
Oleg ℕizhnik
В оригинальном вопрос (и case и обычного тоже)
Про обычные - эта была программа максимум
Да надо было уточнить
Хотел более "генерализованный" метод
источник

S

Simon in Scala User Group
Oleg ℕizhnik
написать код на магнолии, который вытаскивает список полей не проще, чем на рефлекшене, на шейплесе - сложнее, чем на рефлекшене
написать макрос, который это будет делать  - так же, как на рефлекшене
но магнолия и шейплес будет работать только для кейсклассов
позвать имплисиный LabeledGeneric сложно? срсли?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Simon
позвать имплисиный LabeledGeneric сложно? срсли?
Ну там надо позвать LabelledGeneric\Keys\Reify\ToList, всё это найти сложнее и работать будет хуже и ломаться чаще, чем макрос или рефлекшон
источник

S

Simon in Scala User Group
Хуже чем рефлекшен это работать точно не может - рефлекшен если падает, то в рантайме
Ломаться чаще макроса это тоже не может - шейплес под 3.0 работать будет, макрос - нет
источник

Oℕ

Oleg ℕizhnik in Scala User Group
под 2.13 и 3.0 для этого есть встроенные методы
источник

Oℕ

Oleg ℕizhnik in Scala User Group
шейплес под 3.0 с указанными тайпклассами ещё не работает, если я правильно помню
источник

S

Simon in Scala User Group
под 3.0 это автодеривейшн, который в общем та же магнолия, но менее удобный
источник