sbt の build.scala でも Seq[ Setting[_] ] を作るときには、seq を使おう?

追記:
残念ながらsbt 0.13 以降 deprecatedです・・・ https://github.com/sbt/sbt/blob/v0.13.0/main/src/main/scala/sbt/Defaults.scala#L1541-L1542


Seqじゃなくseqという、小文字なのがポイントです。*1

  • Seqを使って型推論にまかせると Seq[sbt.Project.Setting[_ >: java.lang.String with Seq[sbt.ModuleID] ] ] とか変な型になる
scala> Seq(libraryDependencies ++= Seq() ,scalaVersion := "2.10.0")
res0: Seq[sbt.Project.Setting[_ >: java.lang.String with Seq[sbt.ModuleID]]] = List(setting(ScopedKey(Scope(This,This,This,This),library-dependencies)) at NoPosition, setting(ScopedKey(Scope(This,This,This,This),scala-version)) at NoPosition)
  • それを防ぐために、以下のように型を明示してる場合がそれなりにある

https://github.com/scalaz/scalaz/blob/v7.0.0-M7/project/build.scala#L10-L12

  type Sett = Project.Setting[_]

  lazy val standardSettings: Seq[Sett] = Defaults.defaultSettings
  • でもそれ*2、sbt 標準であるよ!

というだけの話

https://github.com/sbt/sbt/blob/v0.12.2-RC2/main/Defaults.scala#L1274

build.sbt 内で使われてるものと同じはずです。まぁ別に型がおかしくならない*3ならSeq使っててかまいませんし、これ知らない人にとっては、短く書けても逆に一瞬よくわからなくなるかもしれませんが・・・

*1:Seqは、Scala標準のもの

*2:Setting[_]の可変長引数をとって、Seq[ Setting[_] ]を返す

*3:おかしくなると、型エラーになって、settingのSeqが渡せない場合がある