Ich habe mehrere Methoden, die ein Wort fälschen, und ich muss sie zufällig aufrufen, bis man erreicht, um einen "menschlichen Fehler" zu schaffen.Rufen Sie eine zufällige Methode, nicht zweimal
Ich möchte eine zufällige Methode aufrufen, dann ein anderes, bis es in Ordnung ist, aber zweimal nie gleich.
Wenn ich sie in ein Array (oder eine Liste) setze, schreibe ich jedes Mal, wenn ich eine Methode ausprobiere, ein Array um, das ist eine hässliche Rechenkomplexität und ich möchte "Scala Style" -Code schreiben, mit möglichst wenig Var und Mutability.
EDIT:
Die Oleg Pyzhcov solution funktioniert gut, aber jetzt habe ich einige Funktionen mit String params und andere ohne. Wie können Funktionen und ihre Aufrufparameter in einer Sammlung gespeichert werden?
val rand: Random = new Random()
def m1(a: String): Boolean = rand.nextBoolean()
def m2(): Boolean = rand.nextBoolean()
def m3(a: String, b: String): Boolean = rand.nextBoolean()
def m4(): Boolean = rand.nextBoolean()
def tryUntilOk(): Unit = {
def out = rand.shuffle(Stream(m1 _, m2 _, m3 _, m4 _))
.map(method => method()) // calling without params so error
.find(result => result) // stop when a method return true
}
EDIT 2:
DETAILS
ich mehrere Methoden, die ein Wort zu fälschen versucht, ohne Garantie, dass sie es erreichen. Einige Methoden nehmen die Stimmung und Zeit eines Verbs, um die Zeit oder die Stimmung zu ändern, andere nehmen nur das Wort richtig, um einige Buchstaben zu entfernen, andere nehmen das Geschlecht und die Nummer eines Nomens, um das Geschlecht zu ändern.
Ich möchte eine zufällige Methode unter allen möglichen nennen, und wenn es das Wort nicht fälschen kann (zum Beispiel das gegebene Substantiv nur in der weiblichen Form existiert), dann rufe einen anderen zufällig an. Wiederholen Sie diese Operation, bis keine weiteren Methoden verfügbar sind, also geben wir auf. Die Lösung von Oleg ist nett für den zufälligen Teil, aber ich kann nicht finden, wie Methoden Parameter Aufruf geben.
Beton exemple:
package Counterfeiters
import Words.Noun
object Noun extends Counterfeiter[Noun] {
override def counterfeit(word: Noun): Unit = {
// For now I call methods without random order
// This one take only one String param
// And split letters that are duplicated like boot -> bot
word.currentWriting = splitDoubleLetters(word.correctWriting)
// Then we compare word.currentWriting and word.correctWriting
// If the word wasn't containing double letters, it isn't counterfeited
if (!word.isCounterfeited)
// This one take 5 String params
// And counterfeit the gender or the number of the word, randomly
word.currentWriting = counterfeitGenderNumberWord("N", word.correctWriting, word.lemma, word.gender, word.number)
}
}
die Lösung von Oleg anwenden zu können, muß ich nur finden, wie Methoden zur Speicherung in einer Sammlung, mit entsprechendem params. In diesem Fall (splitDoubleLetters, (word.correctWriting))
und (counterfeitGenderNumberWord, ("N", word.correctWriting, word.lemma, word.gender, word.number))
.
SOLUTION
Ich tat, was Oleg in einem Kommentar geraten:
object Noun extends Counterfeiter[Words.Noun] {
override def counterfeit(word: Words.Noun): Unit = {
if (word.isCounterfeited) return
def split:() => String =() => splitDoubleLetter(word.correctWriting)
def ctftGenderNumber:() => String =() => counterfeitGenderNumberWord("N", word.correctWriting, word.lemma, word.gender, word.number)
val methods: immutable.Seq[() => String] = Stream(split, ctftGenderNumber)
val res: Option[String] = randomizer.shuffle(methods) // Shuffle methods
.map(method => method()) // Call them one by one
.find(result => result != word.correctWriting) // Until one counterfeit the word
word.currentWriting = res match {
case None => word.correctWriting // If every methods failed
case _ => res.get
}
}
}
SergGr explained auch eine mögliche Architektur, ich dazu passen würde, wie es klar ist.
Sie können meinen vollständigen Projektcode auf GitHub finden, wenn Sie besser verstehen wollen, was ich tue.
VNourdin, ist es nicht klar, was Sie erreichen wollen . Sie sollten uns Ihren "hässlichen" Code mitteilen, damit wir ihn verbessern und die Logik bewahren können. Insbesondere, wo Funktionsaufrufargumente in diesem Code herkommen? Müssen Sie nur Ihre Methoden in teilweise angewandte Funktionen umwandeln? Ist es etwas anderes? – SergGr
Ok ich versuche ein bisschen zu verdeutlichen und konkretes Beispiel zu geben. – VNourdin