suppose que j'ai une fonction comme: et je veux l'appeler comme: p> Cela échouera comme le résultat de Comment puis-je atteindre cela? P> p> s.toint code>, qui est le int code>. Même si je veux transmettre la fonction appelable à appeler dans l'autre méthode. P>
4 Réponses :
Vous pouvez transmettre une fonction appelable à l'aide de Cependant, cela ne va pas aider, car votre fonction Vous avez deux choix: p>
_. TOINT code>, qui est sténographique pour la fonction x => x.toint code>. p>.
DunedunSvalid code> ne fonctionne pas, pour deux raisons: P>
FUNC CODE> LI>
s code> qui n'est pas visible à cette fonction li>
ol>
S code> à DREWNODSVALID CODE> et donnez-le à FUNC CODE> LI>
func code> dans un paramètre => t code> et supprimez les références à s code> dans la chaîne code>. li>
ol>
Si je comprends correctement, vous cherchez cela.
En réalité, le problème est que vous ne réussissez pas la chaîne à votre fonction (FUNC), cela ne fonctionne donc pas. P>
import scala.util.{Failure, Success, Try}
object Solution1 extends App {
private def throwUnlessValid[T](func: (String => T)): T = {
Try {
func("1")
} match {
case Success(_) => //do Something which return T
case Failure(ex) => throw new Error(s"""string: "${ex}" is not a numeric""")
}
}
implicit val intParser: String => Int = (s: String) => {
if (s.trim.isEmpty) {
0
} else {
throwUnlessValid[Int](_ => s.toInt)
}
}
}
La syntaxe est Mais le problème est que vous appelez en utilisant Paramètres de noms , vous pouvez même écrire P> _. TOINT code>, qui est un raccourci pour S => S.Toint code> (ou sans type d'inférence, (S: String) = > S.Toint code>). Généralement, recherchez «Scala Lambdas» pour beaucoup plus d'informations à ce sujet. func () code> sans transmettre une chaîne. Il y a aussi s code> dans jetez nouvelle erreur (S "" "String:" $ {s} "n'est pas un" "") code>; Si S code> est dans votre portée, vous devez avoir Func (s) code> à la place. Ou peut-être que vous voulez p> private def throwUnlessValid[T](func: => T): T = { ... }
throwUnlessValid(s.toInt)
Vous devez corriger votre fonction DunedunSvalid.
Actuellement, il accepte comme argument une fonction qui prend une chaîne comme argument: Cependant, vous essayez de l'appeler sans argument: afin de corriger la fonction lancinantevalid, vous pouvez transmettre TOINT. argument: p> En d'autres termes, vous n'avez pas besoin de modifier votre implémentation d'IntParser existante (y compris func () code> qui a évidemment gagné 'T Travailler. En plus de cela, vous avez également référence à une variable non négligeante S: $ {s} code> qui doit également produire une erreur. P> lancersvalid [int] (S.Toint) code> appel ), vous n'avez besoin que de modifier la mise en œuvre de DrevunSvalid). P> P>
Si je vous comprends correctement, vous avez besoin
_. TOINT code> oustr => str.toint code> (qui sont équivalents)Oui, vous pouvez faire Str => S.Toint, cela fonctionnera, mais cela ne vous permettra pas de voir que vous pouvez voir que vous appelez Func sans la fonction comme 2, il vous donnera une erreur de compilation.