考虑以下代码
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/