可变变化值,红宝石

  • 本文关键字:红宝石 变化 ruby
  • 更新时间 :
  • 英文 :


我不确定这个称为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"

请注意,比使用字符串操纵的版本要简洁得多。

最新更新