Не нужно ли передавать значение параметрам класса с типом опции?

#scala #slick

#scala #скользкий

Вопрос:

этот код:

 class B(d:Int,val b:Option[Int])

object A extends App  {
  val c=new B(1)
}
  

ошибка в строке B(1) , я должен указать значение b , например

 new B(1,Some(2))
  

Я изучаю slick, пример кода:

 final class MessageTable1(tag: Tag) extends Table[Message](tag, "message") {
  

таблица класса находится в файле mainscalaslickrelationalRelationalProfile.scala строка 119:

 abstract class Table[T](_tableTag: Tag, _schemaName: Option[String], _tableName: String) 
  extends AbstractTable[T](_tableTag, _schemaName, _tableName)
  

Итак, у _schemaName есть тип Option[String] , но при создании кода примера Table он, похоже, не передает ему значение, а только дает два других параметра: tag и "message" , почему?

Ответ №1:

Тремя строками ниже вы можете видеть, что у Table есть вспомогательный конструктор с двумя параметрами типа Tag и String (примечание: здесь их нет Option ):

 def this(_tableTag: Tag, _tableName: String) = this(_tableTag, None, _tableName)
  

Это конструктор, который вызывается в показанном вами примере кода, а не основной конструктор.

Вы также можете увидеть два конструктора в <a rel="noreferrer noopener nofollow" href="https:///scala-slick.org/doc/3.3.1/api/index.html#slick.relational.RelationalTableComponent$Table@(_tableTag:slick.lifted.Tag,_tableName:String):RelationalTableComponent.this.Table[T]» rel=»nofollow noreferrer»>документации.