Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby列表值在分配不同的值后是相同的_Ruby On Rails_Ruby_Redis - Fatal编程技术网

Ruby on rails Ruby列表值在分配不同的值后是相同的

Ruby on rails Ruby列表值在分配不同的值后是相同的,ruby-on-rails,ruby,redis,Ruby On Rails,Ruby,Redis,很抱歉标题混乱,不确定如何描述此问题 在RubyonRails控制器中,我正在创建一个名为@commits的列表,其中@commits中的每个项目都应该包含一个哈希表,其元素是每个提交的各种属性的值。这些属性值存储在Redis数据库中 下面,我遍历了一个属性列表,这些属性的值应该从Redis中获取,然后为8个不同的提交中的每个提交获取这些值。然后,我将redis中的值放入每个提交的不同哈希表中,使用提交属性名作为哈希表的键 # Initialize @commits as a list of e

很抱歉标题混乱,不确定如何描述此问题

在RubyonRails控制器中,我正在创建一个名为
@commits
的列表,其中
@commits
中的每个项目都应该包含一个哈希表,其元素是每个提交的各种属性的值。这些属性值存储在Redis数据库中

下面,我遍历了一个属性列表,这些属性的值应该从Redis中获取,然后为8个不同的提交中的每个提交获取这些值。然后,我将redis中的值放入每个提交的不同哈希表中,使用提交属性名作为哈希表的键

# Initialize @commits as a list of eight empty hash tables
@commits = Array.new(8, {})

# Iterate over the attributes that need hashed for each item in @commits
[:username, :comment, :rev, :repo].each do |attrib|
    # 8 items in @commits
    8.times do |i| 
       # Get a value from redis and store it in @commits[i]'s hash table
       @commits[i][attrib] = $redis.lindex(attrib, i)

       # Print the value stored in the hash
       # Outputs 7, 6, .., 0 for @commits[i][:rev]
       puts @commits[i][attrib].to_s
    end
end

# Print the value of every item that was stored in the hash tables above, 
# but only for the :rev key
# Outputs 0 eight times
8.times do |i|
    puts @commits[i][:rev]
end
然而,根据上面的注释,@commits[0..7]在它们的散列中似乎都有相同的值,尽管它们在上面几行似乎被正确存储。以散列键
:rev
为例,第一个
放置
输出7..0,这是正确的,但第二个
放置
将数字0输出八次


有人知道为什么吗?

如果您演示如何初始化
@commits
会有所帮助,但看起来您创建了一个包含对同一对象的多个引用的结构

对所有关键点回收的对象不正确:

@commits = Hash.new([ ])
正确,为每个关键点创建的新对象:

@commits = Hash.new { |h, k| h[k] = [ ] }
您可能使用了具有相同错误的数组:

@commits = Array.new(8, [ ])
这将导致以下行为:

a = Array.new(4, [ ])
a[0]
# => []
a[0] << 'x'
# => ["x"]
a
# => [["x"], ["x"], ["x"], ["x"]]
a=Array.new(4,[]
a[0]
# => []
a[0][“x”]
A.
#=>[“x”]、[“x”]、[“x”]、[“x”]、[“x”]]
它可以通过在块中传递来固定:

a = Array.new(4) { [ ] }
a[0]
# => []
a[0] << 'x'
# => ["x"]
a
# => [["x"], [], [], []]
a=Array.new(4){[]}
a[0]
# => []
a[0][“x”]
A.
#=>[[“x”],[],[],[],[]

但是,看到一个数组用值预先初始化是非常罕见的。通常情况下,它们只是延迟初始化的,或者使用散列来代替数组。

如果您演示如何初始化
@commits
,这会有所帮助,但看起来您创建了一个包含对同一对象的多个引用的结构

对所有关键点回收的对象不正确:

@commits = Hash.new([ ])
正确,为每个关键点创建的新对象:

@commits = Hash.new { |h, k| h[k] = [ ] }
您可能使用了具有相同错误的数组:

@commits = Array.new(8, [ ])
这将导致以下行为:

a = Array.new(4, [ ])
a[0]
# => []
a[0] << 'x'
# => ["x"]
a
# => [["x"], ["x"], ["x"], ["x"]]
a=Array.new(4,[]
a[0]
# => []
a[0][“x”]
A.
#=>[“x”]、[“x”]、[“x”]、[“x”]、[“x”]]
它可以通过在块中传递来固定:

a = Array.new(4) { [ ] }
a[0]
# => []
a[0] << 'x'
# => ["x"]
a
# => [["x"], [], [], []]
a=Array.new(4){[]}
a[0]
# => []
a[0][“x”]
A.
#=>[[“x”],[],[],[],[]

但是,看到一个数组用值预先初始化是非常罕见的。通常情况下,它们只是延迟初始化,或者使用散列代替数组。

使用全局变量,如
$redis
,可能是设计不好的标志。这真的有必要吗?这不是必须的,而且肯定是糟糕的设计,但这是一个我正在试验的一次性项目。我不会在生产环境中这样做。你能告诉我在这些块出现之前是如何初始化/创建@commits的吗?哎呀,我本来打算这么做的。我已经编辑过了,把它包括进去。我有个想法,你在做类似的事情。我添加了一个答案,解释了这个微妙的错误。使用像
$redis
这样的全局变量可能是糟糕设计的标志。这真的有必要吗?这不是必须的,而且肯定是糟糕的设计,但这是一个我正在试验的一次性项目。我不会在生产环境中这样做。你能告诉我在这些块出现之前是如何初始化/创建@commits的吗?哎呀,我本来打算这么做的。我已经编辑过了,把它包括进去。我有个想法,你在做类似的事情。我添加了一个答案,解释了这个微妙的错误。我想你刚刚错过了
@commissions=Array.new(8,{})
更新,不过猜得不错。是的,你一针见血。我误解了Array.new函数是如何初始化数组的。测试并确认你的建议解决了我的问题。谢谢我想你刚刚错过了
@commissions=Array.new(8,{})
更新,不过这是个不错的猜测。是的,你击中了要害。我误解了Array.new函数是如何初始化数组的。测试并确认你的建议解决了我的问题。谢谢