You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我在Ruby中编写字符串反转代码时会意外生成回文字符串?

问题原因解释

核心根源:Ruby字符串为可变对象,赋值默认传递引用

Ruby中字符串属于可变对象,你写new_word = word时,并没有生成新的字符串副本,只是让new_word和入参word指向了内存中的同一个字符串实例。因此你通过new_word[i] = xxx修改字符时,本质就是在修改word指向的同一个字符串,这就是你感知到的「原始word被意外修改」的根因。

你第一段代码标注的预期输出实际并不能得到,实际运行会得到回文形式的结果,比如入参为cat时实际返回为tat,和你描述的异常现象一致。

错误代码的执行逻辑

以入参为bootcamp为例:

  1. 初始状态:word值为bootcamp,new_word和它指向同一个对象
  2. 当i=0时,把new_word[0]设为原字符串最后一位p,此时同一个对象的word值同步变为pootcamp
  3. 迭代到后半段时,你取的word[word.length - i -1]已经不是原始入参的字符,而是被前半段修改后的值,最终就会出现前半段内容重复拼接的回文结果。

修改后代码正常的原因

你把new_word = word改成new_word = ""时,new_word是全新创建的空字符串对象,和入参word完全独立,修改new_word的字符不会对word产生任何影响,每次取的都是原始入参的字符,结果自然符合预期。

如果想要基于原字符串创建独立副本再修改,也可以把赋值语句改为new_word = word.dup,同样可以解决问题。

内容的提问来源于stack exchange,提问作者marwanelesk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:27:03