Ruby map 给出了奇怪的结果

标签 ruby

考虑以下代码

a="123456789"
t=[[1,4],[3,4],[4,5],[1,2]]
p t.map{|x,y|
    a[x],a[y]=a[y],a[x] 
    #p a  
    a
}
我知道 ruby​​ map 方法收集给定块的最后一个表达式,但是当使用上面的代码使用 a 中的索引交换 t 中的字符时,不会成功。我的目的是在索引中的每次交换后收集 a 的状态t 。但是 map 总是给出处于最后状态的 a 数组,即) ["135264789", "135264789", "135264789", "135264789"]
结果表明map方法在完成t中的每个索引后收集了a的最终结果。但是在每次交换后打印a时,在每个状态下打印a的正确值。
这是正确的行为还是我错过了什么?

最佳答案

这是因为 String#[]= 方法改变了字符串。
快速修复将是这样的:

a="123456789"
t=[[1,4],[3,4],[4,5],[1,2]]
p t.map{|x,y]
    b = "#{a}" # IMPORTANT - this builds a new string
    b[x],b[y]=b[y],b[x] # this mutates the new string
    #p b  
    b
}
"#{a}" 的替代方法是说 a.clone ,它在这种情况下做同样的事情。
这样做的原因是因为不是直接用 a 修改 a[x],a[y]=a[y],a[x] ,而是制作 a 的临时副本并修改它
编辑 - 我误读了问题 - 如果你想显示链接前一个结果的每个操作的结果,请在修改后使用 dup/clone 正如 Stefan 在他的回答中所说

关于Ruby map 给出了奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62845424/

相关文章:

ruby - 方法的局部变量与另一个方法同名

ruby - 您如何使用 Nokogiri 遍历 HTML 文档、搜索并跳到下一个项目?

ruby - python setup.py develop 的 Ruby 等价物是什么?

javascript - 如何将椭圆曲线 Diffie-Hellman 与 JS 中的 SJCL 和 Ruby 中的 OpenSSL 结合使用

ruby - 如何编写偶数除以最大相等奇数的代码

ruby - 如何制作无限枚举器

arrays - Ruby - 计算数组中包含两个字符之一的字符串数

javascript - 无法将 Javascript 文件导入到 html.erb 文件

ruby-on-rails - 如何在 rails 2 中做同样的事情?

ruby - 返回可以为多个的所有最大值或最小值