如何将字符串传递给函数而不是通过ref(Ruby)

时间:2011-05-10 14:52:31

标签: ruby string pass-by-reference pass-by-value

检查以下代码

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 个答案:

答案 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
但是,我更喜欢后者。