1

次のコードを確認してください

def wipe_mutterings_from( sentence )
   while sentence.include? '('
     open = sentence.index( '(' )
     close = sentence.index( ')', open )
     sentence[open..close] = '' if close
   end
end

foo='abbba (jjjj) kkkkkk'
wipe_mutterings_from( foo )
p foo

私の理解では、文字列を ref によって関数に渡しました (c/cpp などの低レベル言語で行われるのと同じように)。
文字列を値だけで渡すことは可能ですか (PHP のように)?
関数内で文字列を複製し、コピーでのみ作業できることを十分に認識しています。

4

4 に答える 4

3

いいえ、Ruby ではすべてが参照によって渡され、文字列は変更可能です。dupあなたが言及したように、行うべき一般的なことは、メソッドの最初の文字列にすることです。

ただし、はるかに簡単な方法は、単純に実行せず、代わりに反復ごとに新しい文字列を作成するsentence[open..close]ようなことです。sentence[0...open] + sentence[(close + 1)..-1]そうすれば、文字列の変更について心配する必要はありません。一方、その解決策ではより多くの文字列オブジェクトが作成され、ガベージ コレクターがより多くの作業を行う必要があるため、パフォーマンスが低下しますが、これは、これを何万回も行う場合にのみ関係があります。

于 2011-05-10T14:57:17.137 に答える
1

または、より「Rubyish」な方法を試すこともできます(whileループとインデックス計算を排除します):

foo = 'abbba (jjjj) kkkkkk'
p foo.sub(/\(.*\) /, '')
于 2011-05-10T15:20:32.367 に答える
0

この文字列のコピーだけを送信してみることができます

foo='abbba (jjjj) kkkkkk'
wipe_mutterings_from( foo.clone )
p foo
于 2011-05-10T14:57:30.053 に答える
0

関数で新しい文字列を作成して返さない理由がわかりません。それははるかに読みやすく、驚きが少ないでしょう:

foo='abbba (jjjj) kkkkkk'
new_foo = wipe_mutterings_from( foo )
p new_foo

あるいは

foo='abbba (jjjj) kkkkkk'
foo = wipe_mutterings_from( foo )
p foo

私は後者の方が好きだけど。

于 2011-05-10T14:58:33.930 に答える