Есть ли способ создать константы уровня метода без разрешения пространства имен? - PullRequest
5 голосов
/ 24 февраля 2012

Например, я хочу отфильтровать объект по некоторым значениям поля. Я могу написать

objects.filter{ o =>
   val set = Set(c1,c2)
   set contains o.field
}

в этом случае я буду каждый раз создавать хешсет с методом ==> это будет медленно

Я тоже так могу написать

val set = Set(c1,c2)
objects.filter{ o =>
   set contains o.field
}

Это будет работать быстро, но я загрязняю свое пространство бессмысленным объектом set.

Каков наилучший способ сделать это?

Ответы [ 3 ]

12 голосов
/ 24 февраля 2012

Это похоже на работу:

objects.filter {
  val set = Set(c1,c2)
  o => set contains o.field
}

Если вы выберете "Set (c1, c2)" в def следующим образом:

def getSet = { println("Set!"); Set(5,7)}

Вы увидите, что создан только один набор.

7 голосов
/ 24 февраля 2012

Используйте внутренние именованные функции, они помогают лучше структурировать код и поддерживать чистоту пространства имен.

def someMeaningfulName = {
  val set = Set(c1,c2)
  objects.filter{ o =>
    set contains o.field
  }
}
7 голосов
/ 24 февраля 2012

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

{
  val set = Set(c1,c2)
  objects.filter{ o =>
    set contains o.field
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...