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

或者您可以尝试一种更“红宝石”的方式(消除 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 回答