Suppongo che si desideri che l'ordine rifletta l'ordine di definizione, non ordinato dai nomi dei costruttori.
Questo non è il posto più divertente che ci si potrebbe aspettare perché knownDirectSubclasses
sull'API ClassSymbol
restituisce una serie di simboli, non una sequenza ordinata. Non sono un esperto di interni di scalac, ma according to Eugene Burmako (chi è), la firma di knownDirectSubclasses
riflette solo ciò che sta accadendo in scalac.
Sono stato complaining about this per anni, a proposito, e in vari punti ho provato cose come reading positions off the symbols, ma non funziona davvero.
Il macchinario generico di Shapeless deve prendere una decisione qui, poiché rappresenta tratti sigillati come coprodotti, che ordinano i loro elementi. Al fine di mantenere le cose deterministico, utilizza i nomi dei costruttori di ordinare i casi:
// Entering paste mode (ctrl-D to finish)
sealed trait Letters
case object B extends Letters
case object A extends Letters
// Exiting paste mode, now interpreting.
defined trait Letters
defined object B
defined object A
scala> shapeless.Generic[Letters]
res5: shapeless.Generic[Letters]{type Repr = shapeless.:+:[A.type,shapeless.:+:[B.type,shapeless.CNil]]} = [email protected]
Se questo è ciò che si vuole, è tutto pronto: basta trovare un goodtutorial sulla derivazione generica Shapeless alimentati e elaborare i dettagli. Purtroppo nella maggior parte dei casi non è probabilmente quello che si vuole, anche se (East
, North
, South
, West
? Blue
, Green
, Red
?), E ciò che si vuole (definizione ordinamento) non sembra essere ragionevolmente possibile.
fonte
2016-03-30 09:58:40
L'esempio in questione potrebbe essere solo illustrativo, ma sul volto di esso, l'ordine alfabetico (che è quello che fornisce informe) è esattamente ciò che è stato chiesto ecco ;-) –
@MilesSabin Abbastanza giusto! Questo è praticamente l'unico esempio a cui posso pensare dove i nomi dei costruttori alfabetici sono ciò che si desidera, comunque. :) –