是否可以在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]; }
...
};
答案 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