2010-08-19 18 views
1

J'ai cet héritageconversion implicite à instancier une classe scellée

sealed abstract class MyValue 
case class MyString(s:String) extends MyValue 
case class MyBoolean(b:Boolean) extends MyValue 
case class MyR(m1:MyValue, m2:MyValue) extends MyValue 
case class MyU(m1:MyValue, m2:MyValue) extends MyValue 
/* ... */ 

et

implicit def string2myString(s:String) = MyString(s) 
implicit def boolean2myBoolean(b:Boolean) = MyBoolean(b) 

Mais, je veux faire:

"hello" MyR true // R(MyString("hello"), MyValue(true)) 

Comment je peux le faire?

+0

Peu importe que la classe soit scellée, autant que je vois. Peut-être changer le titre de votre question? –

Répondre

7

Que diriez-vous ceci:

class MyRBuilder(mv1: MyValue) { 
    def this(s:String) = this(MyString(s)) 
    def this(b:Boolean) = this(MyBoolean(b)) 
    def R(mv2:MyValue) = MyR(mv1, mv2) 
} 

implicit def stringToMyRBuilder(s:String) = new MyRBuilder(s) 
implicit def boolToMyRBuilder(b:Boolean) = new MyRBuilder(b) 

"hello" MyR true 
//res2: MyR = MyR(MyString(hello),MyBoolean(true)) 

[Modifier] Je pense en ce qui concerne votre deuxième question Randall a raison. Si vous voulez simplement "l'effet optique" d'un DSL propre, vous pouvez envisager d'utiliser des symboles au lieu de chaînes, par ex. 'hello au lieu de "hello"

+0

Ok, merci beaucoup! C'est parfait! Mais, une autre chose ... Comment je peux faire cela?: Bonjour R vrai (note, sans guillemets) – barroco

+0

'hello' est un identifiant (qui peut se référer à un type, une valeur ou à rien du tout). '" bonjour "' est une chaîne. Il n'existe aucun moyen de convertir un identificateur arbitraire en chaîne ou toute autre valeur. Le texte du programme peut créer un référent pour un identifiant (en le définissant), mais Scala n'est pas homoiconique comme le fait Lisps, donc il n'y a pas moyen d'obtenir ce que je pense que vous voulez. –