2017-05-12 1 views
0

La méthode ont un paramètre implicite ne peut pas être une référence en tant qu'argument? Dans mon code, je crée une méthode qui a un paramètre implicite. Quelque temps je veux juste le transférer à une autre méthode. En ce moment, Scala me donne une erreur. Voir ci-dessous:Scala comment référencer une méthode qui avec un paramètre implicite

case class ComplicatedSalesTaxData(baseRate: Float,isTaxHoliday: Boolean) 
def calcText(amount: Float,rate : (ComplicatedSalesTaxData) => Float) : Float = amount * rate(ComplicatedSalesTaxData(0.06F,false)) 
def rate(implicit cstd:ComplicatedSalesTaxData) = { 
if(cstd.isTaxHoliday) 
    cstd.baseRate 
else 
    0.01F } 

calcText(100F,rate) // will get error : could not find implicit value for parameter cstd: ComplicatedSalesTaxData 
+0

où est l'instance 'implicite' de' ComplicatedSalesTaxData '? –

+0

Tout endroit je vais le déclarer, mais pas ici. Ici, je veux juste transférer la méthode 'rate' à 'calcText' et invoquer avec un 'CompicatedSalesTaxData' qui crée dans 'calcText' – Milk

Répondre

2

Vous devez dire que vous voulez passer le paramètre explicitement:

calcText(100F,rate(_)) 
+0

Merci, mais dans ce cas "rate (_)" est une méthode anonyme et non un référence . – Milk

+0

C'est en fait une fonction ** anonyme **. Si vous aviez défini 'rate' avec un paramètre explicite, passer' rate' comme paramètre à 'calcText' ne passerait pas une référence à la méthode' rate' (une méthode n'est pas un objet, elle n'a pas de références), mais Objet 'Function1' défini par cette méthode. Donc, tout se résume à la même chose, fondamentalement. La différence ici est que, quand on ne donne aucun paramètre, 'rate' est supposé être appliqué à la portée implicite plutôt que d'être considérée comme une fonction. –

+0

Oui, je comprends. Merci beaucoup. – Milk

0

Le message d'erreur que vous avez posté dit que le compilateur ne peut pas trouver un ComplicatedSalesTaxData implicite dans la portée actuelle . Par conséquent, vous devez en définir un. Ensuite, l'appel devrait ressembler à ceci calcText(100F,rate(_)) au lieu du caractère générique _ vous pouvez également transmettre la valeur de façon explicite.