Ruby 将多个布尔值描述为键的数据结构
我有一个javascript天气分类应用程序,我正在将其移植到ruby 分类存储在json中,如下所示: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"
"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"