0
votes

Comment passer la méthode de la chaîne en tant que paramètre appelable?

suppose que j'ai une fonction comme: xxx

et je veux l'appeler comme: xxx

Cela échouera comme le résultat de s.toint , qui est le int . Même si je veux transmettre la fonction appelable à appeler dans l'autre méthode.

Comment puis-je atteindre cela?


2 commentaires

Si je vous comprends correctement, vous avez besoin _. TOINT ou str => str.toint (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.


4 Réponses :


2
votes

Vous pouvez transmettre une fonction appelable à l'aide de _. TOINT , qui est sténographique pour la fonction x => x.toint . .

Cependant, cela ne va pas aider, car votre fonction DunedunSvalid ne fonctionne pas, pour deux raisons:

  1. Vous n'abandonnez pas une chaîne argument sur FUNC
  2. Vous essayez d'imprimer s qui n'est pas visible à cette fonction

    Vous avez deux choix:

    1. PASS S à DREWNODSVALID et donnez-le à FUNC
    2. faire func dans un paramètre => t et supprimez les références à s dans la chaîne .

0 commentaires

0
votes

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)
    }
  }
}


0 commentaires

3
votes

La syntaxe est _. 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.

Mais le problème est que vous appelez 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> xxx pré>

en utilisant Paramètres de noms , vous pouvez même écrire P>

private def throwUnlessValid[T](func: => T): T = { ... }

throwUnlessValid(s.toInt)


0 commentaires

1
votes

Vous devez corriger votre fonction DunedunSvalid. Actuellement, il accepte comme argument une fonction qui prend une chaîne comme argument: xxx

Cependant, vous essayez de l'appeler sans argument: func () qui a évidemment gagné 'T Travailler. En plus de cela, vous avez également référence à une variable non négligeante S: $ {s} qui doit également produire une erreur.

afin de corriger la fonction lancinantevalid, vous pouvez transmettre TOINT. argument: xxx

En d'autres termes, vous n'avez pas besoin de modifier votre implémentation d'IntParser existante (y compris lancersvalid [int] (S.Toint) appel ), vous n'avez besoin que de modifier la mise en œuvre de DrevunSvalid).


0 commentaires