如何将字符串传递给非ref函数(Ruby)

如何将字符串传递给非ref函数(Ruby),ruby,string,pass-by-reference,pass-by-value,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(

检查以下代码

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中)?

我完全知道我可以在函数中复制字符串,并且只处理副本。

不,在Ruby中所有内容都是通过引用传递的,并且字符串是可变的。通常要做的事情是
dup
字符串,这是方法中的第一件事,正如您所提到的


然而,一个更简单的方法是不做
句子[open..close]
,而是做类似
句子[0…open]+句子[(close+1)…-1]
的事情,这会为每次迭代创建一个新字符串。这样你就不用担心字符串的变异了。另一方面,该解决方案将创建更多的字符串对象,这会降低性能,因为垃圾收集器必须做更多的工作,但这只有在您做了数万次之后才有意义。

不,在Ruby中所有内容都是通过引用传递的,字符串是可变的。通常要做的事情是
dup
字符串,这是方法中的第一件事,正如您所提到的


然而,一个更简单的方法是不做
句子[open..close]
,而是做类似
句子[0…open]+句子[(close+1)…-1]
的事情,这会为每次迭代创建一个新字符串。这样你就不用担心字符串的变异了。另一方面,该解决方案会创建更多的字符串对象,这会降低性能,因为垃圾回收器必须做更多的工作,但这只有在您做了数万次之后才有意义。

您可以尝试只发送此字符串的一个副本

foo='abbba (jjjj) kkkkkk'
wipe_mutterings_from( foo.clone )
p foo

您可以尝试只发送此字符串的副本

foo='abbba (jjjj) kkkkkk'
wipe_mutterings_from( foo.clone )
p foo

我看不出为什么不在函数中创建新字符串并返回它。它读起来好多了,也不会有太多惊喜:

foo='abbba (jjjj) kkkkkk'
new_foo = wipe_mutterings_from( foo )
p new_foo
甚至

foo='abbba (jjjj) kkkkkk'
foo = wipe_mutterings_from( foo )
p foo

不过,我更喜欢后者。

我看不出您为什么不在函数中创建新字符串并返回它。它读起来好多了,也不会有太多惊喜:

foo='abbba (jjjj) kkkkkk'
new_foo = wipe_mutterings_from( foo )
p new_foo
甚至

foo='abbba (jjjj) kkkkkk'
foo = wipe_mutterings_from( foo )
p foo
不过,我更喜欢后者。

或者您可以尝试一种更“rubysh”的方式(消除while循环和索引计算):

或者您可以尝试一种更“rubysh”的方式(消除while循环和索引计算):


我问题中的代码来自一个教程,虽然您的答案对于我给出的函数所解决的特定问题很好,但这不是我问题的主题。但是,谢谢!我问题中的代码来自一个教程,虽然您的答案对于我给出的函数所解决的特定问题很好,但这不是我问题的主题。但是,谢谢!我不是在寻找原因,只是如果在Ruby中它是可能的,我在学习语言…我不是在寻找原因,只是如果在Ruby中它是可能的,我在学习语言…不,一切都是通过Ruby中的值传递的,这些值是引用;就像Javano中的对象一样,Ruby中的所有内容都是通过值传递的,这些值都是引用;就像Java中的对象一样