Scala中的重载索引运算符

时间:2011-11-23 22:16:37

标签: scala

是否可以在Scala中重载索引运算符?
如果是,那么这个c ++示例的scala版本会是什么样的?

class Foo {
  int data[7];
  ...
public:
  int& operator[](size_t i) { return data[i]; }
  int  operator[](size_t i) const { return data[i]; }
  ...
};

2 个答案:

答案 0 :(得分:10)

不,不能重载索引运算符,[]由用于指定类型信息的语言(例如List [String])保留,因此不可用于该用途。您可以使用apply函数。与c ++示例中最接近的等价物是:

class Foo {
    val data = Array.ofDim[Int](7)
    //...
    def apply(i : Int) : Int = data(i)
    //...
}

//Usage :
//var f = new Foo
//val aNumber = f(0) 
//aNumber == f.data(0)

scala中的apply函数只是一些语法糖,如果你定义了它,那么f(0)会在幕后扩展到f.apply(0)。如果您希望能够使用f(0) = 4之类的语句,也可以通过相关的update函数来执行此操作。

答案 1 :(得分:8)

scala中的索引运算符是(),您可以定义一个看起来像它的方法。您需要定义一个apply方法。

scala> class Foo(v: String) { def apply(i: Int) = v(i) }
defined class Foo

scala> val f = new Foo("foobar")
f: Foo = Foo@c3dd7e

scala> f(3)
res3: Char = b