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

Ruby 将多个布尔值描述为键的数据结构,ruby,data-structures,Ruby,Data Structures,我有一个javascript天气分类应用程序,我正在将其移植到ruby 分类存储在json中,如下所示: "classification": [ { "warm": false, "sunny": false, "windy": false, "desc": "cold-drizzle" }, { "warm": false, "sunny": false, "windy": true, "desc": "storm"

我有一个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
除此之外,还有八种不同的分类

用什么简洁的ruby方式来描述这种结构?可能是以多个布尔值作为键的哈希?

与JSON(对象数组)完全相同: 您可以使用Struct类复制JSON中的对象

classifications = []
Classification = Struct.new(:warm, :sunny, :windy, :desc)
classifications << Classification.new(false, false, false, "cold_drizzle")
可以使用纯整数:

classifications = {}
classifications[0] = "cold_drizzle"
classifications[1] = "storm"
您可以使用数组:

classifications = {}
classifications[[false, false, false]] = "cold_drizzle"
或者任何你喜欢的东西。这个问题有点开放,但有一些想法。

使用JSON#解析 给定一个有效的JSON字符串,您可以将其解析为一个有效的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['classification'].first
#=> {"warm"=>false, "sunny"=>false, "windy"=>false, "desc"=>"cold-drizzle"}

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 = {}
classifications[ [false,false,false] ] = "cold-drizzle"
classifications[ [false,true, false] ] = "winter-wonderland"
p classifications[ [false,true,false] ]
#=> "winter-wonderland"

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

您不能将其解析为JSON并使用您获得的对象吗?(您将获得一个
分类的数组
)您只是显示了json,没有说明它的含义,也没有提供任何规则性,也没有说明它是如何使用的。我们应该如何告诉你描述结构的简明方法?哦,对我来说,很明显,从000到111的三个布尔值。很抱歉,也许没有。描述您需要如何使用它,根据值的组合查找描述肯定会有助于指导实现。仅仅存储数据很容易。您需要高效地存储它吗?有效地修改它?有效地增加它?有效地阅读?或者只是作为一个程序员轻松地与它交互?
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"
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"