4

次のCコードは、列挙型と配列を列挙型から任意のものへの効率的な「マップ」として使用します。

enum Color { ColorRed, ColorGreen, ColorBlue, ColorSize};


void f() {
  int x[ColorSize];
  x[ColorRed]   = 12;
  x[ColorGreen] = 33;
  x[ColorBlue]  = 4;
  return x[ColorGreen];
}

これはScalaで可能ですか?
つまり、ケースクラスから何かへの「マップ」を作成し、ツリーやハッシュマップとしてではなく、効率的な配列として実装します。ただし、Intではなく特定のタイプでのみインデックスを作成できるようにしたいと思います。

更新:要するに、Scala配列をある種の列挙型(ケースクラスまたは列挙型)でインデックス付けしたいと思います。

4

3 に答える 3

3

小さな列挙の場合、Cの動作を「シミュレート」できます。

abstract sealed class Color(val index: Int)

object Color {
  implicit def col2int(color:Color) = color.index
}

case object ColorRed extends Color(0)
case object ColorGreen extends Color(1)
case object ColorBlue extends Color(2)

...

import Color._
val array = Array(1,2,3)
array(ColorRed) = 12

しかし、特に安全ではないため、これが良いスタイルと見なされるとは思えません。マップを使用するのがより良いアプローチです。または、色表示を処理する特殊なデータ構造で配列をラップすることもできます。

class ColorArray[T:ClassManifest] {
  val array = new Array[T] (3)
  def apply(color: Color) = array(color.index)
  def update(color: Color, value: T) = array(color.index) = value
}

...

val cArray = new ColorArray[Int]()
cArray(ColorRed) = 12
println(cArray(ColorRed))
于 2011-01-28T08:33:42.817 に答える
3
オブジェクトColorextendsEnumeration {
  val ColorRed、ColorGreen、ColorBlue=値
}

Color._をインポートします
def f:Map [Color.Value、Int] =
  マップ(ColorRed-> 12、ColorGreen-> 33、ColorBlue-> 4)

于 2011-01-28T06:18:47.257 に答える
1

完全なCパフォーマンスが必要な場合は、次のように実行できます。

trait CEnum {
private var size = 0;
def value = { size += 1; size-1 }
}

object Color extends CEnum {
  val colorRed = value 
  val colorGreen = value 
  val colorBlue = value 
  val colorSize = 3
}

import Color._

def f() = {
  val x = Array[Int](colorSize)
  x(colorRed) = 12
  x(colorGreen) = 33
  x(colorBlue) = 4
  x(colorGreen)
}

Cの方法と同じように安全ではなく、パフォーマンスも同じです。しかし、それは非常に危険です。

于 2011-01-28T10:17:53.570 に答える