2011-05-10 69 views
1

检查下面的代码如何不通过REF(红宝石)

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 

在我的理解我已经由参传递的字符串的函数(很像是低级语言,如C进行传递字符串函数/ CPP)。
是否有可能只通过值传递字符串(如在PHP中)?
我完全知道我可以复制函数内部的字符串,并且只能在副本上工作。

回答

3

不,一切都通过Ruby中的引用传递,并且字符串是可变的。正如你所提到的,常见的事情是dup字符串是方法中的第一件事。

但是,更简单的方法是简单地不做sentence[open..close],而是像sentence[0...open] + sentence[(close + 1)..-1]那样为每次迭代创建一个新的字符串。这样你就不用担心变异字符串。另一方面,该解决方案会创建更多的字符串对象,这会降低性能,因为垃圾回收器必须完成更多的工作,但只有在数万次的情况下才能实现。

+0

没有,一切都按值在Ruby中过去了,这些值是引用;就像在Java中的对象 – user102008 2011-08-11 07:21:47

0

你可以尝试发送此字符串

foo='abbba (jjjj) kkkkkk' 
wipe_mutterings_from(foo.clone) 
p foo 
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 

我更喜欢后者,虽然。

+0

我没有找到一个理由,只是如果可能在Ruby中,我正在学习语言...... – 2011-05-10 18:19:33

1

或者你可以尝试更多的“rubyish”的方式(消除while循环和指数计算):

foo = 'abbba (jjjj) kkkkkk' 
p foo.sub(/\(.*\) /, '') 
+1

我的问题中的代码是来自教程,虽然你的答案对于特定问题我给的解决功能,这不是我的问题的主题。但是,谢谢! – 2011-05-10 18:18:42