Scala中的重载索引运算符

Har*_*ald 3 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]; }
  ...
};
Run Code Online (Sandbox Code Playgroud)

non*_*unk 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)
Run Code Online (Sandbox Code Playgroud)

applyscala中的函数只是一些语法糖,如果你定义它然后f(0)扩展到f.apply(0)幕后.如果您希望能够f(0) = 4通过相关update功能使用您也可以这样做的语句.


Mat*_*ell 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
Run Code Online (Sandbox Code Playgroud)