あなたのコードで抱えている問題は、あなたがinput.split(" ")
を呼んでいますが、ないということですそれを保存してからinput == "u" # ...
をチェックすると、autocorrect('u')
またはautocorrect('you')
を呼び出した場合、"your sister"
が返されます。ex次の行のためにを呼び出してください:input.join(" ")
はエラーを投げます。
このエラーは、input
がまだ元の文字列であり、各単語の配列ではなく、文字列にjoin
メソッドがないことを忘れないでください。あなたのコードが可能最小限の変更で作業を取得するために
は、あなたがそれを変更することができますので、
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
、今、あなたあなたsplit(" ")
入力した後、各単語で何かをやっている、とあなたはあります各単語を"u"
と"you"
と照合して、入力文字列全体ではなく、その後、置換する単語またはオリジナルのいずれかをマップし、それらを戻すために単一の文字列に戻します。代替案として
、短い方法、あなたは、置換を行うために2番目のパラメータとしてHash
を取ることができたString#gsub
を使用することができます。
2番目の引数がハッシュされ、マッチしたテキストがある場合そのキーの1つ、対応する値は置換文字列です。
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"
その例では正規表現が出てくるように見える:\b
は、任意のワード境界であることを
/\b(you|u|another word)\b/
。
'input ==" u "'は 'input.length'が1であることを意味します。後者のチェックは冗長です。 – Stefan