2017-10-13 1 views
0

Se référant à la question suivante en SO, quelle est l'utilité de passer Unit à une fonction au lieu de () ou vice versa?Quel est le but de passer `unit` à une fonction Scala

Functions without arguments, with unit as argument in scala

+1

Je vous simplement supposer insistant sur le fait que la fonction doit avoir un paramètre, même son Tuple0 actuellement à savoir, donc vous pouvez étendre les choses dans le futur. Prenez-le comme une option pour vous exprimer l'idée de conception originale. – Pavel

+0

pouvez-vous modifier votre question pour inclure un code qui montre précisément ce que vous voulez demander? une expression anglaise comme "passing' Unit' à une fonction "est ambiguë, le code est défini. –

Répondre

1

D'après ce que je peux vous dire voulez savoir quelle est la différence entre ces deux définitions de méthode, et pourquoi on utiliserait l'unité sur() dans le paramètre de la fonction.

def func1(f:Unit=>String) = { 
    println(f) 
} 

def func2(f:()=>String) = { 
    println(f) 
} 

la différence peut être mis en évidence en regardant la sortie de ce code:

func1(Unit => "hello") 
func2(() => "hello") 

vous pourriez être surpris de voir cette sortie:

<function1> 
<function0> 

Unité => Chaîne est en fait une fonction avec 1 paramètre. While() => String est une fonction avec 0 paramètres.

Dans Scala() pourrait signifier deux choses

  • il pourrait être utilisé pour l'unité par exemple val x: Unit =()
  • il peut être utilisé pour représenter aucun paramètre.

Dans func2, c'est une fonction sans paramètre. "Unit" dans func1 est en fait la classe abstraite dans le paquet scala (dont il n'existe qu'une seule valeur "Unit" ou "()"). Ainsi, lorsque la fonction Unit => String a été définie, nous avons défini une fonction qui prend un paramètre de type Unit en tant que paramètre et renvoie une valeur. Pas une fonction qui ne prend aucun paramètre.

Un tweak final au code pour mettre en évidence la différence:

def func1(f:Unit=>String) = { 
    println(f(Unit)) 
} 

def func2(f:()=>String) = { 
    println(f()) 
    //println(f(Unit)) - does not compile 
} 


func1(Unit => "hello") 
func2(() => "hello") 

Affichera bonjour deux fois.

Je suggère que func2 ou() est généralement ce que les gens veulent, et non func1 ou « Unité »