检查以下代码
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中)?
我完全知道我可以复制函数内部的字符串,只能在副本上工作。
答案 0 :(得分:3)
不,所有内容都通过Ruby中的引用传递,字符串是可变的。常见的事情是dup
字符串是方法中的第一件事,正如你所提到的那样。
然而,一种更简单的方法是简单地不执行sentence[open..close]
,而是像sentence[0...open] + sentence[(close + 1)..-1]
那样为每次迭代创建一个新字符串。这样你就不必担心改变字符串了。另一方面,该解决方案会创建更多的字符串对象,这会降低性能,因为垃圾收集器必须做更多的工作,但这只有在你做了数万次时才有意义。
答案 1 :(得分:1)
或者您可以尝试更“红宝石”的方式(消除while循环和索引计算):
foo = 'abbba (jjjj) kkkkkk'
p foo.sub(/\(.*\) /, '')
答案 2 :(得分:0)
您可以尝试只发送此字符串的副本
foo='abbba (jjjj) kkkkkk'
wipe_mutterings_from( foo.clone )
p foo
答案 3 :(得分: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
但是,我更喜欢后者。