2011-11-23 57 views
3

是否有可能超载Scala中的索引运算符?
如果是,该C++示例的scala版本会是什么样子?Scala中的超载索引运算符

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

回答

8

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

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

scala> val f = new Foo("foobar") 
f: Foo = [email protected] 

scala> f(3) 
res3: Char = b 
10

不,这是不可能的重载索引操作符,[]由用于指定类型信息的语言(列表[字符串]例如)保留等等都是为无法使用。你可以使用的是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函数来执行此操作。