Индекс перегрузки оператора в Scala - PullRequest
3 голосов
/ 24 ноября 2011

Возможно ли перегрузить оператор индекса в Scala?
Если да, как будет выглядеть scala-версия этого примера c ++?

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

Ответы [ 2 ]

10 голосов
/ 24 ноября 2011

Нет, перегрузить оператор индекса невозможно, [ и ] зарезервированы языком для указания информации о типе (например, 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)

Функция apply в scala - это просто некоторый синтаксический сахар, если вы его определили, тогда f(0) будет расширен до f.apply(0) за кулисами. Если вы хотите использовать операторы типа f(0) = 4, вы также можете сделать это с помощью связанной функции update.

8 голосов
/ 24 ноября 2011

Оператор индекса в scala is (), и вы можете определить метод, который выглядит следующим образом. Вам необходимо определить метод применения.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...