0

私は次のコードを持っています

s = 'string1, string2, string3, string4'

s.split(",").each_with_index{ |element, index| puts "line #{index} of #{size_of_array}" }

配列のサイズを取得するための最良の方法は何ですか?ループに渡されるスプリットの同じ行で呼び出すことができるメソッドはありますか?

4

3 に答える 3

2

私はあなたがタップを探していると思います:

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文字短いため、長さではなくサイズに注意してください。

于 2012-09-08T08:25:00.643 に答える
1

配列のサイズを取得するには、単純.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プロパティは生成時に設定され、オブジェクトの削除と配列への追加時に更新されると想定していました。

于 2012-09-08T03:10:06.233 に答える
0

これを行うより速い方法は次のとおりです。

s = 'string1, string2, string3, string4'
(length = s.count(',')) && (length + 1).times{|i| puts "line #{i} of #{length}" }
于 2012-09-08T03:29:50.340 に答える