Как бы я представлял составной ключ в Scala? - PullRequest
7 голосов
/ 28 октября 2011

Если у меня есть

val key1 = "mykey"
val key2 = 427

Возможно ли хешировать обоими? Я мог бы сделать что-то вроде

val compoundKey = key1 + "#" + key2
myhash.put(compoundKey, value)

Однако это кажется немного неуклюжим

Ответы [ 2 ]

12 голосов
/ 28 октября 2011

Используйте Tuple:

val compoundKey = (key1, key2)
9 голосов
/ 28 октября 2011

Я всегда предпочитаю новый тип данных над Tuple по трем причинам:

case class CompoundKey(key1: String, key2: String)
  1. У вас есть имя, особенно в предупреждениях компилятора, и "expected CompoundKey" яснее, чем "expected Tuple2[String,String]". Или это просто поможет вам с аннотацией типа, чтобы сделать ваш собственный код более читабельным, особенно во вложенных структурах, таких как Карты

    val k: CompoundKey = expensiveComputationOrNonObviousMethodCallsInARow(...)
    val keyMap: Map[CompoundKey,Key] вместо Map[(String,String),Key]

  2. Доступ к подразделам в CompoundKey можно осуществлять по имени:

    val ckey = CompoundKey("foo","bar")
    ckey.key1 вместо ckey._1

  3. Позволяет изменить представление вложенного типа, здесь String, позже. Это означает, что если вы измените String на то, что вам не нужно менять Tuple2[String,String] во всем коде. Только CompoundKey должен быть адаптирован.

(я бы даже использовал оболочку case class Key(str: String) для ключевого класса)

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