最初と最後のすべての配列要素にプレフィックスを挿入する方法は?

最初と最後のものを除くすべての配列要素にプリフィックスを追加するにはどうすればよいですか?

そこには1行の解決策がありますか?または私のより "より良い"解決策?

result = ["svn up", "20111128025010", "20111128025022", "pass"]
for i in 1..result.length-2
  result[i]=" - "+result[i]
end
1

2 答え

あなたはこれを次のようにすることができます:

result[1 ... -1].each { |s| s[0, 0] = ' - ' }

2つではなく3つのドットがあることに注意してください。これは、 s [0,0] がインプレースで s を変更するために機能します。 1.9.3以降を使用している場合は、 prepend

result[1 ... -1].each { |s| s.prepend(' - ') }

また、 Tin Man がコメントに注記しているように、ダブルドット範囲演算子を使用することもできます。より一般的です:

result[1 .. -2].each { |s| s[0, 0] = ' - ' }
result[1 .. -2].each { |s| s.prepend(' - ') }

どの範囲演算子を使用するかは、優先事項です。

8
追加された
非常に素晴らしい。ありがとうございました。
追加された 著者 Radek,
@theTinMan:これは、私がトリプルドットを使用する数少ない場所の一つであり、それは主に審美的な理由から認められるでしょう。私はまだ範囲の演算子( 1〜1 vs 1〜-1 )の周りに空白がどれくらいあるべきか議論していますが、ダブルドットとトリプルドットのバージョン。
追加された 著者 mu is too short,
@theTinMan:ええと、範囲演算子の間隔を置いたバージョンが好きで、 .. ... を区別するのに役立ちます。
追加された 著者 mu is too short,
私は 1 ... 1 の代わりに 1 ..- 2 を見るのが好きです。 3ドット範囲の演算子は、コードで簡単に見逃され、メンテナンス上の問題になります。
追加された 著者 the Tin Man,
私は、範囲操作やそれを助ける場所で空白を使う傾向があります。通訳はまったく気にしないので、読みやすさの問題です。
追加された 著者 the Tin Man,

次のようにすることも可能です:

result = ["svn up", "20111128025010", "20111128025022", "pass"]

result[1..-2].map { |s| s.insert(0, '-') }

p result #=> ["svn up", "-20111128025010", "-20111128025022", "pass"]

See ri String#insert

3
追加された