在结构

时间:2016-10-03 12:41:11

标签: ruby

我在' strct'中定义了一个结构。它可以像下一个例子一样添加一些ruby代码吗?

  def strct(i)
        {
          "mwdata": [
       i.times do //incorrect
            {
              "mwtype": "cell",
              "mwsize": [
                1,
                3
              ],
              "mwdata": [
                10,
                23,
                199
              ]
            }
        end //incorrect
          ]
        }
        end

1 个答案:

答案 0 :(得分:0)

您可以使用*乘以数组,但这将创建一个对同一Hash对象的引用数组,更改一个,更改所有这些对象。 (正如@mudasobwa在评论中指出的那样)

def strct(i)
  { "mwdata": [ {...} ] * i }
end

也可以使用tap:

def strct(i)
  { "mwdata" => [].tap do |array|
      i.times do 
        array << { .... }
      end
    end
  }
end

或者注入:

def strct(i)
  { "mwdata" => 1.upto(i).inject([]) do |array|
      array << { .... }
    end
  }
end 

注意

我理解这个问题的原因,因为我经常发现自己在做类似的事情:

def strct(i)
  result = { "foo" => [] }
  i.times do
    result["foo"] << "Something #{i}"
  end
  result
end

快速谷歌搜索给了我:hash_builder.rb就像jsonbuilder一样,可以用来创建哈希&#34;模板&#34;。