2016-12-11 9 views
1

forループを使用して文字の配列を検索しようとすると、エラー(文字列への暗黙の変換なし)が発生する理由を理解しています実際の問題であると思われる結果の文字列に追加します)。ただし、同じ目的でwhileループや 'each'を使用する場合は使用できません。私は多くのドキュメントを見てきましたが、なぜこれが起こっているのかの答えを見つけることができませんでした。私は「それぞれの」方法を使用して1日と呼ぶことができると理解していますが、原因と効果を理解することを望みます(将来この問題を避けることを望みます)。Ruby forループのデータ型変換エラー

次の方法は、元の文字列である "result"を印刷し、 "!"任意の母音の代わりに。

s="helloHELLO" 
result="" 
vowels=["a","e","i","o","u","A","E","I","O","U"] 
string_array=s.split("") 
    string_array.each do |i| 
    if vowels.include?(i) 
     result+="!" 
    else 
     result+=i 
    end 
    end 
puts result 

はしかし、私の最初の試み上記のエラーが発生します(下記掲載なし):「ゼロのない暗黙的な変換を文字列に」引用行実験を通して5,9

s="helloHELLO" 
result="" 
vowels=["a","e","i","o","u","A","E","I","O","U"] 
string_array=s.split("") 
    for i in 0..string_array.length 
    if vowels.include?(string_array[i]) 
     result+= "!" 
    else 
     result+=string_array[i] 
    end 
    end 
puts result 

、私がために管理しましたそれを働かせてください。 「結果」に格納するのではなく画面に印刷することで、文字列「result」へのターゲット文字の連結中に問題が発生すると判断しました。しかし、なぜ "string_array [i]"(行番号9)が文字列ではなくNILとして見えるのですか?私は非常に明白な何かを逃しているように感じる。

重要な場合:これは、データ型とfor..inループの仕組みに関する基本的な質問につながるCodeWarsの単なるカタです。これは非常に関連していたようですが、私の質問マークの100%ではない:"for" vs "each" in Ruby

ご協力いただきありがとうございます。

編集:

さて、私はそれを理解したと思います。私はまだいくつかの答えを確認したり、明確にしたり、真っ向から反論したりするのが大好きです。

私は、私はforループを使用したい場合、私はむしろ「0..array.length」よりも「範囲」として配列自体を使用する必要があることに気づいたので、のような:だから

s="helloHELLO" 
result="" 
vowels=["a","e","i","o","u","A","E","I","O","U"] 
string_array=s.split("") 
    for i in string_array 
    if vowels.include?(i) 
     result+= "!" 
    else 
     result+=i 
    end 
    end 
puts result 

"each"メソッド変数(この場合、 "i")はメインブロックのスコープ外に存在しないので、 'vowels'配列に含まれているかどうかを評価した後、そのデータ型はnilになりますか?

答えて

0

あなたforループ:10

しかしstring[10] #=> nil 0〜

for i in 0..string_array.length 

ループがインデックス10でどの要素がありませんし、行9であなたがresult

nilを追加しようとするので、
result = result + string_array[i] #expanded 

nilをこのような文字列に追加することはできません。nilを明示的に文字列に変換すると、エラーが発生します。次に、あなたのループが最後の要素、string[9]で終了します

for i in 0..string_array.length-1 

:この問題を解決する最良の方法は、ループのためにあなたを変更することです。

0

インデックス0で始まる配列を繰り返すときに古典的なエラーで終わったのは、終わりの位置としてlengthの代わりにlength-1でなければなりません。 しかし、あなたは他のプログラミング言語から来ているようですが、あなたのコードはRubesqueではなく、 'For'はあまり使われません。 Rubyは他の多くの言語よりも高い言語です。多くのソリューションが組み込まれています。Rubyはプログラマーを幸せにするためのものです。あなたが達成しようとしていることは、ただ一つの行で行うことができます。

"helloHELLO".scan(/[aeoui]/i).count 

いくつかの説明:配列リテラル「HELLOこんにちは」はStringクラスのオブジェクトを意味し、文字列であり、そのようなものとして、正規の文字列をスキャンすると、スキャンのように、あなたが使用できるメソッドをたくさん持っていますexpression/[aeoui]/[]に囲まれた文字のいずれかを意味し、最後のiは大文字小文字を区別しないので、AEOUIを追加する必要はありません。スキャンは、一致する文字を含む配列を返します.Arrayクラスのオブジェクトには、メソッドのcountがあります。これは、ドリフトを取得したら、互いに作用するメソッドを組み合わせることができます。