Je voudrais créer une fonction avec la signature suivante:Conversion à tuple avec par nom paramètre
def myFunction[T](functionWithName: (String, => T)): T
pour que je puisse l'appeler, par exemple, comme ceci: val x = myFunction("abc" -> 4 * 3)
. Cependant, Tuple n'accepte pas le paramètre by-name, donc la signature ci-dessus est invalide.
Inspiré par this answer, j'ai essayé la conversion implicite suivante:
implicit class ByName[T](getValue: => T) extends Proxy {
def apply(): T = getValue
def self = apply()
}
def myFunction[T](functionWithName: (String, ByName[T])): T = {
// do something
functionWithName._2()
}
L'implicite ne fonctionne pas dans ce cas, cependant (contrairement à la réponse liée).
- Pourquoi la conversion implicite en
ByName
ne fonctionne pas? - Comment puis-je obtenir l'effet désiré en appelant
myFunction("abc" -> 4 * 3)
où4 * 3
est passé par son nom?
Pourquoi un tuple, ce qui ne va pas avec 2 paramètres? –
@ insan-e Il y aura effectivement plusieurs variantes de myFunction. Il peut être appelé comme 'myFun (" a "-> 1 * 2," b "-> 3 * 4)' ou 'myFun (" a "-> 1 * 2," b "-> 3 * 4," c "-> 5 * 6)', etc. Parce qu'il peut y avoir beaucoup d'arguments, je voudrais éviter toute syntaxe inutile pour le garder lisible. – Mifeet
Je vois. Vous ne pouvez pas le faire probablement parce que [tuples] (https://github.com/scala/scala/blob/v2.12.3/src/library/scala/Tuple2.scala#L19) ont des arguments enthousiastes. La seule façon que je vois est de faire le nom entier de tuple, 'functionWithName: => (String, T)' ... –