Почему перечисление scala не выбирает значения из другого перечисления в качестве значения? - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь понять, почему перечисление scala не выбирает значения из других типов перечисления, когда создается как значение в нем.Скажем, у меня есть следующее

trait SchemaBase extends Enumeration {

  implicit def valueToVal(x: Value): Val = x.asInstanceOf[Val]

  case class Val(name: String, dataType: DataType, nullable: Boolean) extends super.Val {
    val col: Column = functions.col(name)
  }

  protected def column(name: String, dataType: DataType, nullable: Boolean = true): SchemaBase.Val = {
    Val(name, dataType, nullable).asInstanceOf[SchemaBase.Val]
  }

object SchemaBase extends SchemaBase

Теперь, если я создам Enumeration s AScehma и BSchema, как показано ниже:

object ASchema extends SchemaBase {
  val Id: SchemaBase.Val = column("a_id", IntegerType)
  val BName: SchemaBase.Val = BSchema.Name
}

object BSchema extends SchemaBase {
  val Name: SchemaBase.Val = column("b_name", StringType)
}

Здесь ASchema.BName не будет доступнов ValueSet из ASchema.

Я понимаю, BName - это значение перечисления BSchema и знаю подход к решению этой проблемы, но хотел бы знать , почему такое поведение?

1 Ответ

1 голос
/ 20 сентября 2019

Каждый вызов метода Value добавляет новое уникальное значение в перечисление.

Это должно быть " Value constructor ", и, конечно, вызов может быть косвенным (например, column вызывает SchemaBase.Val конструктор, который вызывает Enumeration.Val конструктор, который вызывает Enumeration.Value конструктор).Как говорится в следующем предложении, это просто соглашение, что

эти значения обычно определяются как члены перечисления val.

Вы можете иметь других членов илине определять некоторые или все значения как val с.И

val BName: SchemaBase.Val = BSchema.Name

не вызывает конструктор Value (ASchema или BSchema).Вот и все.

...