我有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
除此之外还有八种不同的分类。
描述这种结构的简洁红宝石方法是什么?也许是一个以多个布尔值作为键的散列?
答案 0 :(得分:1)
您可以使用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字符串,您只需将其解析为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"}