私は次のコードを持っています
s = 'string1, string2, string3, string4'
s.split(",").each_with_index{ |element, index| puts "line #{index} of #{size_of_array}" }
配列のサイズを取得するための最良の方法は何ですか?ループに渡されるスプリットの同じ行で呼び出すことができるメソッドはありますか?
私はあなたがタップを探していると思います:
s.split(',').tap{|a| a.size.times{|i| puts "line #{i} of #{a.size}"}}
しかし、実際には、ただ; 同じ行に好きなだけ保持します:
a = s.split(','); a.size.times{|i| puts "line #{i} of #{a.size}"}
2文字短いため、長さではなくサイズに注意してください。
配列のサイズを取得するには、単純.length
にそれを呼び出します。さて、同じ行でこれを行うことはできないと思います。次のように機能しますか?
s = 'string1, string2, string3, string4'
split_s = s.split()
split_s.each_with_index{ |element, index| puts "line #{index} of #{split_s.length}"}
これが受け入れられない場合は、私に知らせてください。他にできることがあるかどうかを確認します。
アップデート
すべてを1行にまとめたい場合は、多くの冗長性があります。たとえば、次のことができます。
s = 'string1, string2, string3, string4'
s.split(",").each_with_index{ |element, index| puts "line #{index} of #{s.split(',').length}" }
しかし、冗長性はわかりますか?s.split('、')はすべての要素に対して呼び出されます。そのため、上記のように別の行に保存することを提案しました。
更新2
以下のコメントのようにsplit_s.length
、ループを呼び出す前に保存することも効率each_with_index
的です。これは、要素もループするためです。コメントありがとうございます!以前は、length
プロパティは生成時に設定され、オブジェクトの削除と配列への追加時に更新されると想定していました。
これを行うより速い方法は次のとおりです。
s = 'string1, string2, string3, string4'
(length = s.count(',')) && (length + 1).times{|i| puts "line #{i} of #{length}" }