如何将字符串传递给非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中的对象一样