2011-04-01 4 views
2

Disons que j'ai quelque chose comme ceci:scala retour tuples des fonctions

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! 
    } 

}

Trier de supposer que someLookupToV retourne un objet, qui a un champ id, puis j'avoir une autre recherche basé sur v.id. Je veux retourner les deux valeurs en tant que tuple. Mais que dois-je faire si Some (v) ne correspond à rien? Qu'est-ce que je retourne? Aucun et (Aucun, Aucun) n'a pas fonctionné. Scala accepté (null, null) mais je n'ai aucune idée si c'est la bonne chose à faire ...

+0

'null' existe dans Scala principalement pour l'interopérabilité avec Java. Il est préférable de l'éviter autant que possible et d'utiliser 'Option',' Some' et 'None' lorsque vous avez des valeurs qui peuvent être vides. – Jesper

Répondre

15

Je ne voudrais pas le retour de la fonction (Int, Option[Int]), mais Option[(Int, Option[Int])]:

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

ou, un peu plus courte:

def f = someLookupToV.map(v => (v.id, someOtherLookup(v.id))) 
1

Si vous voulez retourner (Aucun, Aucun), votre ligne "case Some" doit retourner un tuple de (Option, Option). Comme indiqué dans votre exemple, votre case Some renvoie (Int, Option). C'est en supposant que votre v.id est un Int et someOtherLookup renvoie une Option.