在Scala中`val(_,x)= ......'是什么意思?

时间:2015-08-27 22:17:03

标签: scala

我正在尝试理解此scala代码(已从here修改):

val ConnectionDefinition(_, eventConnection) =
  Connection.definition[EventRepo, Connection, Event]("Event", EventType)

这是在object内。看起来它正在使用函数Connection.definition[EventRepo, Connection, Event]("Event", EventType)的返回值来实例化一个case类,解包返回值(?),但是:

  1. 为什么只是val ConnectionDefinition(_, eventConnection)?这是某种匿名价值还是某种东西,因为没有标识符(例如val myVal = ...
  2. 为什么甚至懒得给ConnectionDefinition名称提供任何参数(即eventConnection)?

2 个答案:

答案 0 :(得分:5)

正在定义的val是eventConnection,这是调用unapply返回的ConnectionDefinition实例的解构(Connection.definition)中的第二个参数。现在eventConnection将可用于其余代码(返回的ConnectionDefinition实例的其余部分将不会,但可能不是必需的。)

答案 1 :(得分:0)

你看到的是一个解构赋值,第一个值被忽略了。

ConnectionDefinition是一个包含两个值的案例类。案例类自动实现一个提取器(unapply方法),它在模式匹配时调用。

您可以使用此语言功能执行以下操作:

case class ConnectionDefinition(edgeType: ObjectType, connectionType: ObjectType)
object Connection {
  def definition(): ConnectionDefinition = ???
}

// basic assignment:
val conn = Connection.definition()
val conn: ConnectionDefinition = Connection.definition()

// extract the two values from the case class:
val ConnectionDefinition(edgeType, connType) = Connection.definition()
val ConnectionDefinition(edgeType: ObjectType, connType: ObjectType) = Connection.definition()

// extract only one value and ignore the other:
val ConnectionDefinition(edgeType, _) = Connection.definition()
val ConnectionDefinition(_, connType) = Connection.definition()

// extract both values AND still keep a reference to the whole ConnectionDefinition
val conn @ ConnectionDefinition(edgeType, connType) = Connection.definition()