scala, возвращающая кортежи из функций - PullRequest
2 голосов
/ 01 апреля 2011

Допустим, у меня есть что-то вроде этого:

def f () = {

   var v = someLookupToV()

   match v {
       case Some(v) => (v.id, someOtherLookup(v.id))
       case None => None // <<-- doesn't work, but I'm not sure what to put there!
   }

}

Предположим, что someLookupToV возвращает некоторый объект с идентификатором поля, а затем у меня есть другой поискна v.id.Я хочу вернуть оба значения в виде кортежа.Но что мне делать, если Some (v) ничего не соответствует?Что мне вернуть?None и (None, None) не работали.Скала приняла (ноль, ноль), но я понятия не имею, правильно ли это делать ...

Ответы [ 2 ]

15 голосов
/ 01 апреля 2011

У меня не было бы функции возврата (Int, Option[Int]), но вместо этого Option[(Int, Option[Int])]:

def f = someLookupToV match {
  case Some(v) => Some(v.id, someOtherLookup(v.id))
  case None => None
}

или несколько короче:

def f = someLookupToV.map(v => (v.id, someOtherLookup(v.id)))
1 голос
/ 01 апреля 2011

Если вы хотите вернуть (None, None), ваша строка case Some должна возвращать кортеж (Option, Option).

Как написано в вашем примере, ваш case Some возвращает(Int, Option).Это предполагает, что ваш v.id является Int, а someOtherLookup возвращает Option.

...