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 Array 由某种枚举(案例类或枚举)索引。

4

3 回答 3

3
对象颜色扩展枚举{
  val ColorRed、ColorGreen、ColorBlue = 值
}

导入颜色._
def f:Map[Color.Value,Int] =
  地图(颜色红色 -> 12,颜色绿色 -> 33,颜色蓝色 -> 4)

于 2011-01-28T06:18:47.257 回答
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

但是,我怀疑这会被认为是好的风格,尤其是因为它不安全。使用映射是一种更好的方法,或者您可以将数组包装在处理 Color indizes 的专用数据结构中:

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 回答
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 回答