我不确定这个称为origstring的变量如何在我的循环中更改值
def scramble_string(string, positions)
i = 0
origString = string
puts origString
newString = string
while i < string.length
newString[i] = origString[positions[i]]
i = i + 1
end
puts origString
return newString
end
例如,如果我运行scramble_string(" abcd",[3,1,2,0])在第二个" put"中,原始串从第一个" put"中的" abcd"变化为" dbcd"。如果我只声明一次,我将如何更改Origstring的价值?
当您在Ruby中说x = y
时,它会创建一个变量,并引用完全相同的对象。对x
的任何修改都适用于y
,反之亦然:
y = "test"
x = y
x[0] = "b"
x
# => "best"
y
# => "best"
您可以这样说:
x.object_id == y.object_id
# => true
它们是相同的对象。您想要的是首先制作副本:
x = y.dup
x[0] = "b"
x
# => "best"
y
# => "test"
这将产生两个独立的对象:
x.object_id == y.object_id
# => false
因此,就您而言,您需要更改它:
orig_string = string.dup
现在说,通常是使用返回副本的功能而不是操纵事物的功能,通常是使用Ruby中的最佳方法。一个更好的解决方案是:
def scramble_string(string, positions)
(0...string.length).map do |p|
string[positions[p]]
end.join
end
scramble_string("abcd", [3, 1, 2, 0])
"dbca"
请注意,比使用字符串操纵的版本要简洁得多。