Scala - mutables (var) paramètre méthode de référence

EDIT: je reçois des upvotes ici. Juste pour mémoire, je n'ai plus pense que c'est important. Je n'ai pas besoin d'elle depuis que je l'ai posté.

Je voudrais faire suite à la Scala ...

def save(srcPath: String, destPath: String) {
    if (!destPath.endsWith('/'))
        destPath += '/'
    //do something
}

... mais je ne peux pas car destPath est un val. Est-il possible de déclarer destPath var?

Remarque: il y a des questions similaires, mais dans tous les OP voulais juste modifier le tableau.

S'il vous plaît ne pas conseiller suivantes:

La mutation des paramètres d'entrée est souvent considéré comme de mauvais style et le rend
plus difficile de raisonner sur code.

Je pense que c'est valable dans la programmation impérative (Scala permet à la fois, non?) et d'ajouter quelque chose comme tmpDestPath voudrais juste ajouter l'encombrement.

EDIT: Ne vous méprenez pas. Je sais que les chaînes ne sont pas mutables et je ne veux pas d'une référence à la référence, parce que je ne veux pas modifier les données de l'appelant. Je veux juste modifier référence locale de la chaîne de l'appelant m'a donné à ma chaîne (par exemple. orig + '/'). Je veux modifier cette valeur uniquement dans la portée de la méthode actuelle. Regardez, c'est parfaitement valide en Java:

void printPlusOne(int i) {
    i++;
    System.out.println("i is: " + i);
    System.out.println("and now it's same: " + i);
}

Je n'ai pas à créer une nouvelle variable et je n'ai pas à calculer i+1 deux fois.

  • Après la clarification, la réponse est: Vous ne pouvez pas.
  • C'est ce que je soupçonnais. Je vais le poster à la scala-débat.
  • Eh bien, de la Scala de la communauté n'est pas vraiment favorable à l'idée d'être en mesure de modifier directement les paramètres de la fonction, que ce soit par valeur ou par référence. Le raisonnement est le même que celui de pourquoi Scala manque aussi quelque chose d'autre à partir de votre exemple: unaire ++ opérateur(s) pour les types numériques. De telles choses lattes de non-fonctionnels, des effets secondaires de la programmation orientée style, qui est quelque chose que la Scala généralement vous encourage à éviter. Comme il est, si vous voulez à plusieurs reprises de les muter un paramètre de fonction, vous devez d'abord l'enregistrer dans une var, ce qui rend vos intentions plus clair, de toute façon!
  • En fait, ce n'est pas la raison de l'absence de ++. Le problème avec ++ est qu'il ne peut être mis en œuvre comme une méthode d'une classe -- il faudrait une langue fonctionnalité intégrée dans le compilateur, et spécifiques à certains types.
  • Derp. Je corrige la position des mains.
  • Je n'en achète pas. Si vars sont admis dans le corps de la méthode, il n'y a pas de raison qu'ils ne devraient pas être autorisés dans les paramètres. Pour moi, la Scala est plus comme Python ou Perl où je peux choisir si je vais le faire fonctionnelle ou l'impératif de style.
  • Et personne ne prend ce choix, loin de vous; vous êtes juste très légèrement incommodés par un besoin de placer le paramètre dans une variable locale. Scala est tout simplement de vous encourager à faire le plus fonctionnel chose. Vous êtes bien entendu libre de continuer à prendre ce avec le reste de la communauté–que je ne parle pas pour–mais j'ai tout simplement pour vous informer de ce à quoi s'attendre.
  • Je suis d'accord avec woky et procède à la scala-débat à l'appui de son fil (si je peux le trouver). Il n'a pas de sens à force de la verbosité, parce que l'écrasement de la valeur dans le paramètre d'entrée n'est pas la fonction non-pur. Seulement la modification de données contenues dans ce que la valeur du paramètre références, la fonction non-pur, et qui s'applique à la val sur les membres de la classe pour les données. C'est un langage d'erreur de conception.
  • J'ai ajouté un fil de discussion, "les paramètres de la fonction ne sont pas autorisés à être var", à la scala-débat puisque je ne pouvais pas trouver la vôtre.
  • Scala spécifiquement positionne comme un langage fonctionnel. En tant que tel, il serait logique d'en déduire qu'il ne fait pas de promesses sur qui permet à un développeur d'utiliser impératif paradigmes. Comme un lourd Python utilisateur je suis habitué à l'inverse. Beaucoup de gens dans cette communauté voulez plus de fonctionnalités, mais Guido (créateur et BDFL) a rappelé à de nombreuses reprises, Python n'est pas un langage fonctionnel, il a simplement certaines fonctions que les gens associent avec les langages fonctionnels parce qu'ils sont vraiment utiles.
  • Si vous pensez, "je souhaite que mon langage de programmation pourrait muter paramètres", puis le problème n'est pas le langage de programmation.
  • Pour l'enregistrement, le fait que vous n'avez pas besoin de plus cela n'est pas pertinent. C'est une très bonne question pour ceux d'entre nous qui savent que le fait de pouvoir re-utiliser un identificateur est beaucoup mieux que d'être forcé à avoir l'original inutile identifiant dans le champ d'application, et sans courir le danger de accidentellement en se référant, par conséquent, l'introduction d'un bug subtil. Le fait que la Scala ne permet pas la modification des arguments de méthode est un excellent exemple de ce que j'appelle fonctionnel nazisme.
  • Je upvoted la question parce que c'est un très bon, et j'avais juste demandé à moi-même. L'obtention d'un droit de réponse "Vous ne pouvez pas" est également utile 🙂

InformationsquelleAutor woky | 2012-03-02