Das Problem, das Sie mit Ihrem Code sind ist, dass Sie input.split(" ")
nennen, aber sie tun nicht sparen, das zu etwas, und dann überprüfen Sie input == "u" # ...
und input
ist immer noch die gesamte Zeichenfolge, wenn Sie also autocorrect('u')
genannt oder autocorrect('you')
Sie "your sister"
zurück, ex bekommen würde cept für die nächste Zeile: input.join(" ")
wird einen Fehler auslösen.
Dieser Fehler ist, weil erinnern, input
ist immer noch die ursprüngliche Zeichenfolge, kein Array von jedem Wort, und Zeichenfolgen haben keine join
Methode.
Um Ihren Code arbeiten mit den wenigsten Änderungen möglich zu erhalten, können Sie es ändern:
def autocorrect(input)
#replace = [['you','u'], ['your sister']]
#replace.each{|replaced| input.gsub!(replaced[0], replaced[1])}
input.split(" ").map do |word|
if (word == "u" && word.length == 1) || word == "you"
"your sister"
else
word
end
end.join(" ")
end
jetzt also, Sie sind mit jedem Wort, nachdem Sie etwas zu tun split(" ")
der Eingang, und Sie sind Überprüfen jedes Wort gegen "u"
und "you"
, anstelle der gesamten Eingabezeichenfolge. Sie ordnen dann entweder das Ersatzwort oder das Original zu und fügen sie dann zu einer einzelnen Zeichenfolge zurück, um sie zurückzugeben.
Als Alternative kürzere Weise können Sie String#gsub
verwenden, die ein Hash
nehmen kann als der zweite Parameter Ersetzungen zu tun:
Wenn das zweite Argument ein Hash ist, und der zugehörige Text ist einer seiner Schlüssel ist der entsprechende Wert der Ersetzungsstring.
def autocorrect(input)
replace = { 'you' => 'your sister',
'u' => 'your sister',
'another word' => 'something else entirely' }
input.gsub(/\b(#{replace.keys.join('|')})\b/, replace)
end
autocorrect("I am u so smitten with utopia you and another word")
# => "I am your sister so smitten with utopia your sister and something else entirely"
die Regex in diesem Beispiel suchen kommt aus wie:
/\b(you|u|another word)\b/
mit \b
Grenze jedes Wort zu sein.
'input ==" u "' impliziert, dass "input.length" 1 ist. Die letzte Überprüfung ist redundant. – Stefan