【问题标题】:Two sets of constructor parameters in a scala classScala类中的两组构造函数参数
【发布时间】:2010-07-28 09:33:02
【问题描述】:

这段代码有什么作用?为什么有两组构造函数参数?

class A(val x: Int)(val y: Int)

我可以初始化一个对象并使用这两个字段:

val a = new A(5)(7)
println(a.x + ", " + a.y)

如果我把它做成一个case类,我只能通过第一组参数来匹配。

case class A(x: Int)(y: Int)
val a = A(5)(7)
a match {
  A(x) => println(x)
}

无法创建 3 组参数。它不编译。那么这两组构造函数参数是什么意思呢?

【问题讨论】:

标签: class scala constructor


【解决方案1】:

根据scala specification(参见第5.3 节),第二组参数专用于隐式参数。将参数分成两组允许您仅定义非隐式参数,并让其他参数根据上下文进行定义。

实际上编译器在第二组中接受非隐式参数是很奇怪的。

【讨论】:

  • 谢谢。如果我将 implicit 关键字添加到第二组中,它开始是隐式的,但如果没有 implicit 关键字,它就不是隐式隐式的。无论如何,scala 规范不允许在第二组中使用非隐式参数。
  • 嗯......规范的这一部分似乎很奇怪:语法下方给出的示例似乎与语法不对应。而“class Test (a:Int)(b:Int)(c:Int)”是一个有效的类定义。
  • @PeWu +1 表示“没有隐含关键字,它不是隐含的”:)
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 2013-09-08
  • 2017-12-29
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多