2011-05-10 70 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