5

<<ループ内で演算子を使用して作成されている巨大な文字列があります。最後に最後の2文字を削除したいと思います。

some_loop
  str << something
end
str = str[0..-3]

上記の最後の操作もメモリと時間を消費すると思いますが、よくわかりません。<<同じ文字列から最後の2文字を削除できるように、とは逆の効果を持つ操作があるかどうかを確認したかっただけ です。

4

3 に答える 3

8

実際、文字列のスライスは、本当に必要になるまで文字列の内容がコピーされないため、すでに高速でメモリ効率の高い操作です。

「 doubleの表示:Rubyが文字列値を共有する方法」の詳細な説明を参照してください。

これは文字列操作のやや古典的な最適化であることに注意してください。あなたもJavaでそれを持っていて、私たちはしばしばCで同様のトリックを使用しました。

だから、することを躊躇しないでください:

str = str[0..-3]

これらの文字を本当に削除する必要がある場合は、これが正しく、推奨され、効率的な方法です。Sergioの回答を参照してください。

于 2012-08-20T09:27:09.817 に答える
3

万が一、いくつかの配列要素をセパレータで結合していますか?このようなもの?

names = ['Mary', 'John', 'Dave']

res = ''
names.each do |n|
  res << n << ', '
end

res # => 'Mary, John, Dave, '

はいの場合、より簡単な方法があります。

names.join(', ') # => 'Mary, John, Dave'
于 2012-08-20T09:26:29.980 に答える
1

最後の2文字が改行/改行(CR / LF)の場合String.chomp(またはString#chomp!文字列を変更する場合)を使用できます。

それ以外の場合は、次を使用できます。

2.times{ string.chop! }

また

string.chop!
string.chop!
于 2012-08-20T09:36:32.130 に答える