1

このような任意のバイト数またはブール値をとるクラスをScalaで記述したい

class Bytes(data: Byte*) {
  def this(data: Boolean*) = this {
    val res: Array[Byte] = convBools2Bytes(data)

    res: _*
  }

  // […]
}

ここで、は:に変換するconvBools2Bytes関数です。Array[Boolean]Array[Byte]

def convBools2Bytes(data: Array[Boolean]): Array[Byte]

これにより、次のコンパイラエラーが発生します。

[error] Bytes.scala:5: no `: _*' annotation allowed here
[error] (such annotations are only allowed in arguments to *-parameters)
[error]     res: _*
[error]        ^

私が理解している限り、このres: _*ステートメントArray[Byte]は繰り返されるパラメーターのリストになります(「Scalaでのプログラミング」第2版のセクション8.8で説明されているように)。

なぜそのようなエラーがあり、どうすればそれを回避できますか?

4

1 に答える 1

6

コンパイラが言うように、varargパラメータへの引数でのみそれを使用できます。ブロックに拡張されたvarargリストを返させようとしていますが、これは許可されていません。ブロックを使用したい場合は、次のようにします。

this({
  val res: Array[Byte] = convBools2Bytes(data)
  res
}: _*)

それ以外の場合は、これも問題ありません

this(convBools2Bytes(data): _*)

ただし、別の問題が発生します。消去すると、両方に同じ署名が付けられ、コンパイルが妨げられます。とにかく過負荷にならないほうがいいと思います

于 2012-07-23T20:48:30.390 に答える