用于将多个布尔值描述为键的数据结构

时间:2013-05-06 20:17:19

标签: ruby data-structures

我有javascript天气分类应用程序,我正在移植到ruby。

分类存储在json中

"classification": [
  {
    "warm": false,
    "sunny": false,
    "windy": false,
    "desc": "cold-drizzle"
  },
  {
    "warm": false,
    "sunny": false,
    "windy": true,
    "desc": "storm"
  },
  {
    "warm": false,
    "sunny": true,
    "windy": false,
    "desc": "winter-wonderland"
  }, etc

除此之外还有八种不同的分类。

描述这种结构的简洁红宝石方法是什么?也许是一个以多个布尔值作为键的散列?

3 个答案:

答案 0 :(得分:1)

与JSON(对象数组)完全相同:

您可以使用Struct类来复制JSON中的对象

classifications = []
Classification = Struct.new(:warm, :sunny, :windy, :desc)
classifications << Classification.new(false, false, false, "cold_drizzle")

你也可以只有一个哈希数组:

classifications = []
classifications << {warm: false, sunny: false, windy: false, desc: "cold_drizzle"}

或者,如果您正在寻找带有三个布尔值的哈希作为描述的关键:

您可以再次使用Struct:

classifcations = {}
Classification = Struct.new(:warm, :sunny, :windy)
classifications[Classification.new(false, false, false)] = "cold_drizzle"

你可以使用普通整数:

classifications = {}
classifications[0] = "cold_drizzle"
classifications[1] = "storm"

您可以使用数组:

classifications = {}
classifications[[false, false, false]] = "cold_drizzle"

或者你喜欢的任何其他东西。这个问题有点开放,但有一些想法。

答案 1 :(得分:1)

Ruby中的哈希可以被任何东西索引,包括其他哈希。所以:

classifications = {}
classifications[ {warm:false, sunny:false, windy:false} ] = "cold-drizzle"
classifications[ {warm:false, sunny:true,  windy:false} ] = "winter-wonderland"

p classifications
#=> {
#=>  {:warm=>false, :sunny=>false, :windy=>false}=>"cold-drizzle",
#=>  {:warm=>false, :sunny=>true, :windy=>false}=>"winter-wonderland"
#=> }

p classifications[ {sunny:false, windy:false, warm:false } ]
#=> "cold-drizzle"

请注意我在读取值时用于哈希键的任意顺序。您不必使用您在编写时使用的完全相同的哈希对象(就像使用Lua一样),您只需使用其数据相同的哈希。

由于Ruby方法调用的语法糖,您甚至可以省略上面的所有{}(除了声明哈希的地方):

classifications[ warm:false, sunny:false, windy:true ] = "stormy"

p classifications[ warm:false, sunny:false, windy:false ]
#=> "cold-drizzle" 

如果你想要更简洁但描述性更低,你也可以只使用数组作为你的键:

classifications = {}
classifications[ [false,false,false] ] = "cold-drizzle"
classifications[ [false,true, false] ] = "winter-wonderland"
p classifications[ [false,true,false] ]
#=> "winter-wonderland"

请注意 - 与散列作为键一样 - 您不需要使用完全相同的对象来索引散列,只需要一个被认为相等的对象。

答案 2 :(得分:0)

使用JSON#parse

给定一个有效的JSON字符串,您只需将其解析为JSON#parse的有效Ruby哈希。例如:

require 'json'

json_string = <<EOF
  {"classification": [{
      "warm": false,
      "sunny": false,
      "windy": false,
      "desc": "cold-drizzle"
    }, {
      "warm": false,
      "sunny": false,
      "windy": true,
      "desc": "storm"
    }, {
      "warm": false,
      "sunny": true,
      "windy": false,
      "desc": "winter-wonderland"
    }]}
EOF

hash = JSON.parse(json_string)

然后,您可以使用各种方法访问新的Hash object。例如:

hash['classification'].first
#=> {"warm"=>false, "sunny"=>false, "windy"=>false, "desc"=>"cold-drizzle"}