Scala中的超载索引运算符
问题描述:
是否有可能超载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]; }
...
};
答
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
答
不,这是不可能的重载索引操作符,[
和]
由用于指定类型信息的语言(列表[字符串]例如)保留等等都是为无法使用。你可以使用的是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
函数来执行此操作。