Базовый хэш-карта Scala - возвращаемые типы игнорируются - PullRequest
1 голос
/ 30 сентября 2011

Я пробую Scala, в частности Hashmap - я пробовал что-то вроде этого (как с явным указанием типов, так и без него):

scala> var x = HashMap("a" -> 1, "b" -> 2)
x: scala.collection.immutable.HashMap[java.lang.String,Int] = Map(a -> 1, b -> 2)
scala> x.get("a")
res0: Option[Int] = Some(1)

scala> x.get("a") + x.get("b")
<console>:10: error: type mismatch;
 found   : Option[Int]
 required: String
       x.get("a") + x.get("b")

Как ни странно, даже несмотря на то, что Int правильно выведен, я не могу сохранить их как Int - поэтому, например, я не могу суммировать их после get

Я что-то упустил?

Ответы [ 2 ]

13 голосов
/ 30 сентября 2011

Взгляните на тип возврата метода get.Он возвращает Option[Int], а не Int:

def get (key: A): Option[B]

. Option[Int] может быть либо Some, содержащим целое число, либо None (которое вы получите, если ключ былотсутствует на карте).

Если вы просто хотите получить Int и, возможно, выбросить NoSuchElementException, если данный ключ не существует на карте, просто используйте метод applyили его короткий синтаксический сахар:

x("a") + x("b")

Или, если вы хотите добавить значения внутри Option[Int] с, возвращая еще один Option[Int]:

for (a <- x.get("a"); b <- x.get("b")) yield a + b

Это даст вам Some, если оба ключа присутствуют, и None, если один или оба отсутствуют.

В качестве альтернативы, если вы не заботитесь о пропавших ключах и хотите использоватьзначение по умолчанию, если ключ отсутствует, используйте getOrElse:

x.getOrElse("a", 0) + x.getOrElse("b", 0)
4 голосов
/ 30 сентября 2011

Обратите внимание, что .get("a") возвращает Option[Int].Вы не можете добавить Option[Int] даже явно.Я подозреваю, что часть String - красная сельдь из-за неявного преобразования параметров, которое находится в области видимостиВы можете добавить их, если вы развернете их из Option:

scala> var y = x.get("a").get + x.get("b").get
y: Int = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...