2016-09-27 1 views
0

Comment appeler une telle fonction scala?Comment appeler une fonction scala prenant une valeur de type Void

def f(v: Void): Unit = {println(1)} 

Je n'ai pas encore trouvé de valeur de type Void dans Scala.

+2

'f (nul)' peut-être? –

+0

Fonctionne comme un charme! Mais pourquoi 'null' fonctionne, comment est-il lié à' Void'? – zyxue

+1

Le type 'Null' (dont' null' est une instance) est une sous-classe pour tous les types de références (http://docs.scala-lang.org/resources/images/classhierarchy.img_assist_custom.png). 'Void' est un type de référence (une sous-classe de' Object', aka 'AnyRef'). –

Répondre

1

Je crois utilise Void/null en Java est similaire à l'utilisation Unit/() à Scala. Considérez ceci:

abstract class Fun<A> { 
    abstract public A apply(); 
} 

class IntFun extends Fun<Integer> { 
    public Integer apply() { return 0; } 
} 

public static <A> A m(Fun<A> x) { return x.apply(); } 

Maintenant que nous avons défini la méthode générique m nous voulons aussi l'utiliser pour les classes où apply est seulement utile pour ses effets secondaires (à savoir que nous devons retourner quelque chose qui indique clairement qu'il est inutile). void ne fonctionne pas car il casse Fun<A> contrat. Nous avons besoin d'une classe avec une seule valeur qui signifie « baisse la valeur de retour », et il est Void et null:

class VoidFun extends Fun<Void> { 
    public Void apply() { /* side effects here */ return null; } 
} 

Alors maintenant, nous pouvons utiliser m avec VoidFun.

Dans l'usage Scala de null est découragée et Unit est utilisé à la place (il n'a qu'une seule valeur ()), donc je crois que la méthode que vous avez mentionné devait être appelé à partir de Java. Pour être compatible avec Java Scala a null qui est la seule instance d'une classe Null. Qui est à son tour un sous-type de toute classe de référence, de sorte que vous pouvez affecter null à n'importe quelle variable de classe de référence. Ainsi, le modèle Void/null fonctionne également à Scala.

0

Void, ou plus précisément, java.lang.Void, a ce qui suit dans le documentation:

The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void.

En Scala, il n'y a pas de mot clé void, donc le type Void est essentiellement inutile dans Scala. La chose la plus proche est soit une fonction sans paramètre, c'est-à-dire def f: Unit = {println(1)} que vous pouvez appeler en utilisant f ou f(), soit le type Unit pour les fonctions qui ne renvoient rien, comme dans votre exemple.

+0

Je lisais une [fonction] (https://github.com/bigdatagenomics/adam/blob/master/adam-core/src/main/scala/org/bdgenomics/adam/converters/FastqRecordConverter.scala#L61) qui prendre une valeur de type 'Void' dans une autre base de code, donc j'ai inventé un plus simple pour tester. – zyxue

+0

La fonction s'exécute-t-elle réellement lorsque vous appelez 'f (_)' ou crée-t-elle une fonction partiellement appliquée? EDIT: Je réalise aussi que je n'ai pas vraiment répondu à ta question :) – spiffman

+0

Non, tu as raison. Je me trompe toujours. Pouvez-vous m'aider à jeter un oeil à une [fonction] (https://github.com/bigdatagenomics/adam/blob/master/adam-core/src/main/scala/org/bdgenomics/adam/converters/FastqRecordConverter.scala # L61) ci-dessus et commenter ce qui se passe? – zyxue