Могу ли я перегрузить скобки в Scala? - PullRequest
8 голосов
/ 24 августа 2010

Попытка выяснить, как перегрузить скобки в классе.

У меня есть этот код:

class App(values: Map[String,String])
{
  // do stuff
}

Я бы хотел получить доступ к значениям карты следующим образом:

var a = new App(Map("1" -> "2"))
a("1") // same as a.values("1")

Возможно ли это?

Ответы [ 4 ]

20 голосов
/ 24 августа 2010

Вам необходимо определить метод apply.

class App(values: Map[String,String]) {
  def apply(x:String) = values(x)
  // ...
}
9 голосов
/ 24 августа 2010

Для полноты следует сказать, что ваше «apply» может принимать несколько значений, и что «update» работает как двойник «apply», допуская «перегрузку скобок» в левой части назначений

Class PairMap[A, B, C]{
   val contents: mutable.Map[(A,B), C]  = new mutable.Map[(A, B), C]();
   def apply(a:A, b:B):C = contents.get((a, b))
   def update(a:A, b:B, c:C):Unit = contents.put((a, b), c)
}

val foo = new PairMap[String, Int, Int]()
foo("bar", 42) = 6
println(foo("bar", 42)) // prints 6

Основное значение всего этого состоит в том, что он не позволяет людям предлагать дополнительный синтаксис для вещей, которые должны были быть специально выделены в более ранних языках семейства C (например, присвоение элементов массива и выборка).Это также удобно для заводских методов на объектах-компаньонах.Помимо этого, следует соблюдать осторожность, так как это одна из тех вещей, которая может легко сделать ваш код слишком компактным, чтобы его можно было действительно прочитать.

5 голосов
/ 24 августа 2010

Как уже отмечали другие, вы хотите перегрузить apply:

class App(values: Map[String,String]) {
  def apply(s: String) = values(s)
}

Пока вы это делаете, вы можете захотеть перегрузить сопутствующий объект, примените также:

object App {
  def apply(m: Map[String,String]) = new App(m)
}

Тогда вы можете:

scala> App(Map("1" -> "2"))  // Didn't need to call new!
res0: App = App@5c66b06b

scala> res0("1")
res1: String = 2

хотя от того, что вы пытаетесь сделать, зависит, будет ли это выгода или путаница.

4 голосов
/ 24 августа 2010

Я думаю, что это работает с использованием apply: Как работает волшебство метода apply () в Scala?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...