Неявное преобразование в экземпляр закрытого класса - PullRequest
1 голос
/ 19 августа 2010

У меня есть это наследство

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
/* ... */

и

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

Но я хочу сделать это:

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

Как я могу это сделать?

1 Ответ

7 голосов
/ 19 августа 2010

Как насчет этого:

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))

[Редактировать] Я думаю, что по поводу вашего второго вопроса Рэндалл прав.Если вы просто хотите получить «оптический эффект» чистого DSL, вы можете использовать символы вместо строк, например, 'hello вместо "hello"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...