Supposons que j'ai une fonction scala censée renvoyer un tuple de type
dans le code de l'appelant: p> Le code est incomplet. Alors, comment puis-je déclarer et retourner le tuple dans la fonction et comment utiliserais-i que j'utiliserais dans le scénario ci-dessus? P> est le type recommandé par Tuple dans la case ci-dessus, même si la carte semble mieux adaptée? P> malgré Toutes les réponses que j'ai reçues, aucune réponse n'a abordé la question de savoir comment puis-je déclarer tuple et remplir le tuple plus tard dans le code (ne pas attribuer aux valeurs à tuple à la déclaration de temps comme cette réponse suggère: P> (chaîne, int, int) mappé sur les touches (mots, rangées, col) code>: var words, row, col // how do I delcare tuple here?
if(someValue) {
getResults(someValue) // assigns the tuple values to keys words, row and col
// how I do that here ?
// reference words, row and col variables here
} else
getResults(someOtherValue) // assigns the tuple values to keys words, row and col
// reference words, row and col variables here
}
5 Réponses :
L'assidation multiple peut être effectuée dans un Mode syntaxiquement simple ( qui repose sur les types de tuple ' Vous pouvez simplement modifier ce dernier exemple à: p> Le Si vous vous demandiez comment annoter votre déclaration de méthode avec le type de retour, c'est facile aussi: P> non apply code>), comme suit: si code> L'instruction renvoie un (chaîne, int, int) code> et les composants correspondants seront attribués à mots code> , ligne code> et col code> dans la commande. p> def getResult(param: Int): (String, Int, Int) = {
...
}
Cela semble être une solution propre répondant à la moitié de ma question, mais malheureusement dans mon cas dans le code réel, il y a beaucoup de blocage dans le cas de l'affectation des autres VARS déclarés à l'extérieur du bloc, etc., donc je ne pouvais donc pas utiliser votre approche.
Cela ressemble à votre blocage pourrait être refoulé - surtout à la lumière de cette tâche multiple assez simple, il est souvent préférable d'avoir des blocs comme celui-ci élaborer plusieurs variables (par exemple, hôte code>, port code> , chemin code> pour la configuration de la connexion HTTP) et renvoyez-les sous forme de tuple - en les attribuant aux variables requises immédiatement à l'extérieur du bloc.
@RJC, je pense que @ andrzej-doyle a répondu à votre question à la portée complète.
Quand j'ai ajouté mon commentaire à ce moment-là, la réponse avait moins d'informations qu'aujourd'hui.
@Andrzej: Vous avez oublié un signe égal dans la signature de méthode getresult code>.
@RJC: Vous devriez penser à refactoriser votre code. BTW beaucoup d'aller peut se produire dans le si sinon code> présenté par Andrzej ...
Les tuples en tant que valeurs de retour sont utiles lorsque vous avez une fonction qui doit renvoyer plusieurs valeur et où ces valeurs n'ont pas besoin de rester ensemble en tant que structure (si elles ont besoin de rester ensemble, cela aurait plus de sens à Définissez une classe de cas simple).
Pour déclarer une fonction avec un 3 tuple en tant que type de retour et renvoyer un 3 tuple, vous ferez: p> ceci est en réalité du sucre syntaxique pour: p> scala a des classes tuplen pour N: 1 à 22 p> p>
Les tuples sont ok mais vous pouvez également envisager la classe de cas: Il est immuable et a beaucoup de fonctionnalités utiles. Je préfère la classe de cas sur les tuples, car les champs ont des noms utiles. En savoir plus ici: http://www.codecommit.com/blog/ scala / classes de cas-sont-cool p> p>
Tout d'abord, vous devez décider si vous avez besoin d'une carte.
Vous voudrez peut-être une carte car p>
Jusqu'à présent, cela ne ressemble à aucune de ces trois choses sont le cas. Donc, vous n'avez pas vraiment besoin de map em>, vous avez juste besoin d'un nom em> pour vos différents types de données. (C'est-à-dire que vous pouvez laisser le compilateur gérer le mappage entre votre nom et les données correspondantes.) P> La manière la plus directe d'obtenir des valeurs nommées est avec une classe de cas: P> println(getResult._3) // Prints 10
AM I DROITEZ QUE VOUS ASSUMÉ Vous souhaitez déclarer vos variables de résultat (et devez-la y accéder en dehors de la construction if / else), puis appelle le code qui les définit et les utilise (à l'intérieur de la construction if / autre)? Si tel est le cas, il devrait être aussi simple que
var words: String = _
var row: Int = _
var col: Int = _
...
if (someValue) {
val (words, row, col) = getResults(someValue)
// use words, row, col
// Note: keyword 'val' added per comments by Prometheus and John Threepwood below
} else {
val (words, row, col) = getResults(someOtherValue)
// use words, row, col
// Note: keyword 'val' added per comments by Prometheus and John Threepwood below
}
Cette solution jette une erreur avec SCANA 2.9.1 lors de la tentative de ré-attribution des mots mots code>, ligne code> et col code> dans la ligne (mots, rangée, col) = getResults (...) code>.
Même pour moi, on dirait que pour une raison quelconque, ce n'est plus valide.
Comme indiqué par @JohnTreepwood, à Scala 2.13.5, la syntaxe correcte est Val (mots, rangée, col) = getResults (quelqueévalue) code>
Merci@prometheus - avez-vous mis à jour ma réponse en conséquence.
Attribuez-vous des valeurs à
mots code>,ligne code> etcol code> plusieurs fois, écrasant ainsi leur contenu?