1

私はこの遺産を持っています

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

どうすればそれができますか?

4

1 に答える 1

7

これはどう:

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

[編集] 2 番目の質問については、Randall が正しいと思います。クリーンな DSL の「光学効果」だけが必要な場合は、文字列の代わりにシンボルを使用することを検討してください'hello"hello"

于 2010-08-19T17:54:17.520 に答える