加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何使用多个参数列表消除案例类创建的歧义?

发布时间:2020-12-16 09:55:07 所属栏目:安全 来源:网络整理
导读:我有一个看起来像这样的案例类: case class A(first: B*)(second: C*) 第一个和第二个都重复,所以我把它放在单独的参数列表中.但是,我希望在很多情况下第二个可能是空的,所以能够使用类似A(???,???)的类而不用尾随空括号将是很好的.我尝试了以下方法: case
我有一个看起来像这样的案例类:

case class A(first: B*)(second: C*)

第一个和第二个都重复,所以我把它放在单独的参数列表中.但是,我希望在很多情况下第二个可能是空的,所以能够使用类似A(???,???)的类而不用尾随空括号将是很好的.我尝试了以下方法:

case class A(first: B*)(second: C*) {
  def this(first: B*) = this(first: _*)()
}

这让我对重载定义提出了模棱两可的参考.

有没有办法明确地编写这个构造函数调用? (并且我能够调用重载的构造函数而不会再次混淆语法吗?)我的猜测是否定的,有一些关于这种语法糖会如何破坏currying或其他一些问题的争论,但我更愿意听到来自某人的声音比我更多Scala知识;)

解决方法

以下可能会实现您的目标:

case class Foo private(first: List[Int],second: List[Int])

object Foo {
    def apply(first: Int*) = new Foo(first.toList,List.empty[Int]) { 
        def apply(second: Int*) = new Foo(first.toList,second.toList)
    }
}

然后你可以这样做:

Foo(1,2,3)
Foo(1,3)(4,5,6)

由@SillyFreak编辑:这个变体没有给出“结构类型成员的反射访问”警告,所以我认为它应该在性能方面更好一点:

case class Foo private (first: List[Int],second: List[Int])

object Foo {
  def apply(first: Int*) = new Foo(first.toList,List.empty[Int]) with NoSecond

  trait NoSecond {
    self: Foo =>
    def apply(second: Int*) = new Foo(first.toList,second.toList)
  }
}

Foo(1,6)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读