0

我有要移植到 ruby​​ 的 javascript 天气分类应用程序。

分类存储在 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

换句话说,有八种不同的分类。

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

4

3 回答 3

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 方法调用的语法糖,你甚至可以省略上面所有的{and }(除了声明散列的地方):

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"

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

于 2013-05-07T02:39:11.980 回答
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"

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

于 2013-05-06T20:51:44.790 回答
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 对象。例如:

hash['classification'].first
#=> {"warm"=>false, "sunny"=>false, "windy"=>false, "desc"=>"cold-drizzle"}
于 2013-05-07T02:31:27.070 回答