为什么我在Ruby中编写字符串反转代码时会意外生成回文字符串?
问题原因解释
核心根源:Ruby字符串为可变对象,赋值默认传递引用
Ruby中字符串属于可变对象,你写new_word = word时,并没有生成新的字符串副本,只是让new_word和入参word指向了内存中的同一个字符串实例。因此你通过new_word[i] = xxx修改字符时,本质就是在修改word指向的同一个字符串,这就是你感知到的「原始word被意外修改」的根因。
你第一段代码标注的预期输出实际并不能得到,实际运行会得到回文形式的结果,比如入参为cat时实际返回为tat,和你描述的异常现象一致。
错误代码的执行逻辑
以入参为bootcamp为例:
- 初始状态:
word值为bootcamp,new_word和它指向同一个对象 - 当
i=0时,把new_word[0]设为原字符串最后一位p,此时同一个对象的word值同步变为pootcamp - 迭代到后半段时,你取的
word[word.length - i -1]已经不是原始入参的字符,而是被前半段修改后的值,最终就会出现前半段内容重复拼接的回文结果。
修改后代码正常的原因
你把new_word = word改成new_word = ""时,new_word是全新创建的空字符串对象,和入参word完全独立,修改new_word的字符不会对word产生任何影响,每次取的都是原始入参的字符,结果自然符合预期。
如果想要基于原字符串创建独立副本再修改,也可以把赋值语句改为new_word = word.dup,同样可以解决问题。
内容的提问来源于stack exchange,提问作者marwanelesk
相关产品推荐
相关产品推荐

