隐式转换以实例化密封类

发布于 2024-09-15 12:14:26 字数 545 浏览 13 评论 0原文

我有这个继承权

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

我该怎么做?

I have this inheritance

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

and

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

But, I want to do this:

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

How I can do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

请叫√我孤独 2024-09-22 12:14:26

怎么样:

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"

How about this:

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

[Edit] I think regarding your second question Randall is right. If you just want the "optical effect" of a clean DSL, you might consider to use Symbols instead of Strings, e.g. 'hello instead of "hello"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文