【问题标题】:Ruby on Rails - How to change the variable value many times and save it?Ruby on Rails - 如何多次更改变量值并保存?
【发布时间】:2016-02-10 14:38:01
【问题描述】:

我正在尝试这样做:

$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 个变量)

[[
{"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”,它始终是相同的值!我需要随机化它。

【问题讨论】:

  • 听起来英语可能不是你的第一语言。我们还有西班牙语堆栈溢出:es.stackoverflow.com 和葡萄牙语:pt.stackoverflow.com
  • 这个简单的例子似乎按预期工作。为什么你删除了原始的内联代码?我们更喜欢内联代码而不是屏幕截图。
  • $variaveis 到底是什么?我认为这个全局变量是问题的关键。
  • 请不要发布代码链接或使用图片。在搜索或测试您的代码时,我们无法重复使用图像,并且链接会腐烂然后断开,从而导致问题的信息丢失。相反,插入演示问题所需的最少代码,以及必要的输入数据和预期的输出数据。请阅读“How to Ask”。在Ruby中,我们使用snake_case,所以使用this_varnew_var而不是thisVarnewVar
  • @theTinMan 蛇盒真的是红宝石约定吗?我见过骆驼箱和蛇箱都用过,不明白为什么会有所作为。

标签: ruby json


【解决方案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

【讨论】:

  • 100000000000000000.times do |ty|谢谢!!!!!!!!!!!!!!!!!!!!!!!!结束我为它工作了很多天(和几个晚上)你拯救了我的毕业!谢谢!!!!!!!
【解决方案2】:

要更正您的第一段代码,您是否正在寻找:

$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

【讨论】:

  • 或者你可以直接调用rand方法为:newvar.push(rand(0..100))
  • 在我的情况下..我有 1 个数组,其中包含 x 个数(这个 x 将是一个输入字段的值)的 JSON 对象,每个对象有 3 个参数。这个参数之一是“它的值”..当我尝试随机化它时..它可以工作..我把这个 JSON 对象放在一个带有你的新值的新数组中..然后再次进行迭代..这将是有问题的..Hes将最后一个随机值设置为在此迭代之前存储的所有其他 JSON 对象:/
  • 我已经在控制台上发布了我的代码和结果的打印屏幕.. 请参阅第一篇文章.. 也许会更容易理解我:)
猜你喜欢
  • 2015-01-13
  • 2012-09-24
  • 1970-01-01
  • 2018-01-21
  • 2021-11-29
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多