Компактная запись для функций в контейнерах Map? - PullRequest
1 голос
/ 26 марта 2012

Я строю карту записей перечисления для простых средств доступа к данным в объекте.Вот пример (от интерпретатора), использующий Int в качестве ключа:

class Obj(a: Int, b: Int) {
    def getA = a
    def getB = b
}

val m : Map[Int, (Obj) => Int] = Map(
    (2, (o: Obj) => o.getA)
);

val d = m(2)(new Obj(3,4))

Это прекрасно работает, но необходимость писать функцию с типом: Obj явно в параметре в каждом значении карты кажется ненужной:

(o: Obj) => o.getA

Есть ли более жесткий синтаксис, который мне не хватает?

Ответы [ 2 ]

6 голосов
/ 26 марта 2012

В этом случае будет выведен тип, например:

scala> val m : Map[Int, (Obj) => Int] = Map(
     |     (2, _.getA)
     | )
m: Map[Int,Obj => Int] = Map(2 -> <function1>)

scala> m(2)( new Obj(3,4) )
res0: Int = 3

Здесь я использовал подчеркивание, чтобы сделать определение функции максимально кратким, но вы также можете определить функцию как: o => o.getA.Это может быть полезно, если аргумент используется более одного раза, например: o => o.getA + o.getB.

3 голосов
/ 26 марта 2012

Если вы хотите избавиться от аннотации типа с левой стороны (это не всегда хорошая идея, но хорошо для краткости), вы можете оставить исходную правую сторону или немного короче:

val m = Map( (2, (_: Obj).getA) )

Кроме того, в Scala было бы более идиоматично определять ваш класс как

class Obj(val a: Int, val b: Int)
// or
case class Obj(a: Int, b: Int)

и называйте ваши поля просто a и b, поскольку компилятор предоставляет вам геттеры.

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