Ruby on Rails - 如何多次更改变量值并保存?

时间:2015-11-09 20:35:48

标签: ruby json

我试图这样做:

$var = 0 #This stay inside a JSON Object
newVar = []

n.times do |i|
  newVar.push(randomize($var))
end

def randomize(thisVar)
  thisVar = Random.new.rand(0 .. 100)
  return thisVar
end

但是我总是在数组newVar[]

中的所有变量上得到相同的值

我已经尝试过.dup和.clone不给所有字段赋予相同的值。但它不起作用。

真实代码:

    # IdeenAG: Operacoes Geneticas
    def novaPopulacao ()
        puts "\n\nIdeenAG: Criando Populacao ("+$parametros['populacaoInicial']+")\n"

        tempVar = []
        populacaoCriada = []
        xtimes = $parametros['populacaoInicial'].to_i

        xtimes.times do |i|
            populacaoCriada.push(mutar($variaveis.clone))
        end

        puts populacaoCriada.to_s+"\n"
        return populacaoCriada
    end

def mutar (varArray)
    varArray.each_with_index do |variavel,index|
        puts "IdeenAG: Mutando População ("+variavel['nome']+")\n"
        variavel['valor'] = Random.new.rand(variavel['minimo'].to_i .. variavel['maximo'].to_i)
    end

    return varArray
end

实际结果(有3个Vars)

[[
{"nome"=>"var0", "minimo"=>"1", "maximo"=>"99999", "valor"=>70356}, 
{"nome"=>"var1", "minimo"=>"1", "maximo"=>"99999", "valor"=>55356}, 
{"nome"=>"var2", "minimo"=>"1", "maximo"=>"99999", "valor"=>65904}
], 
[
{"nome"=>"var0", "minimo"=>"1", "maximo"=>"99999", "valor"=>70356},      
{"nome"=>"var1", "minimo"=>"1", "maximo"=>"99999", "valor"=>55356},   
{"nome"=>"var2", "minimo"=>"1", "maximo"=>"99999", "valor"=>65904}
], 
[
{"nome"=>"var0", "minimo"=>"1", "maximo"=>"99999", "valor"=>70356}, 
{"nome"=>"var1", "minimo"=>"1", "maximo"=>"99999", "valor"=>55356}, 
{"nome"=>"var2", "minimo"=>"1", "maximo"=>"99999", "valor"=>65904}
],
[
{"nome"=>"var0", "minimo"=>"1", "maximo"=>"99999", "valor"=>70356}, 
{"nome"=>"var1", "minimo"=>"1", "maximo"=>"99999", "valor"=>55356}, 
{"nome"=>"var2", "minimo"=>"1", "maximo"=>"99999", "valor"=>65904}
],
[
{"nome"=>"var0", "minimo"=>"1", "maximo"=>"99999", "valor"=>70356}, 
{"nome"=>"var1", "minimo"=>"1", "maximo"=>"99999", "valor"=>55356}, 
{"nome"=>"var2", "minimo"=>"1", "maximo"=>"99999", "valor"=>65904}
]]

见“valor”字段,它始终是相同的值!我需要随机化它。

2 个答案:

答案 0 :(得分:1)

要纠正您的第一段代码,您在寻找:

$var = 0 #This stay inside a JSON Object
newVar = []

n.times do |i|
  newVar.push(randomize)
end

def randomize
  thisVar = Random.new.rand(0 .. 100)
  return thisVar
end

这会将newVar设置为0到100之间的随机数组。数组的长度为n

答案 1 :(得分:1)

dupclone都只制作浅层复制品,这意味着它们只复制顶级结构。一个典型的json深深嵌套。

一个例子。首先没有副本:

h1 = {a:"a", b:1}
h2 = h1
h1[:a] = "aa"
h2[:a]

这会返回“aa”,因为h1和h2是同一个对象。

现在有了重复

h1 = {a:"a", b:"b"}
h2 = h1.dup
h1[:a] = "aa"
h2[:a]
# returns "a", everything looks good
h1[:b].upcase!
h2[:b]
# returns "B" :-(

h2哈希是新的,但是包含指向旧对象的指针。如果您在适当的位置编辑这些对象,h2也会进行这些编辑。

那么如何解决这个问题呢?通常,您只需从头开始创建jsons对象。您也可以制作一份深层副本,例如在这里查看这个问题:

Ruby dup/clone recursively