是否存在用于在Array中封装对象的Ruby习惯用法?

时间:2013-10-09 16:44:58

标签: ruby xml arrays hash

我正在使用外部API与我交换XML消息。所以我使用了很多Hash#from_xml

但是,#from_xml只对数组中的元素进行编码(如果它们是重复元素)。这是有道理的,但当我试图循环只出现一次的可重复元素时,它就会中断。例如:

<Stuff>
  <SKU>ABC-123</SKU>
  <SKU>DEF-456</SKU>
  <SKU>XYZ-789</SKU>
</Stuff>

效果很好,因为:

my_hash = Hash.from_xml(xmlstring)["Stuff"]

将包含3个SKU,所以我可以这样做:

my_hash["Stuff"].each do |sku|
  # process the sku
end

但是这个XML失败了:

<Stuff>
  <SKU>XYZ-789</SKU>
</Stuff>

因为myhash['SKU']是哈希,而不是数组。我现在必须这样做:

my_hash['SKU'] = [my_hash['SKU']] if my_hash['SKU'].kind_of?(Hash)

有更清洁的方式吗?

3 个答案:

答案 0 :(得分:3)

将它包装在一个数组中并展平它:

array_of_one_or_many = [my_hash['SKU']].flatten

如果它已经是一个数组,它将打开它并使它成为一个普通的数组。适用于这两种情况。

答案 1 :(得分:1)

过去我遇到这个时,我已经使用了

foo = ([] << bar).flatten

bar是对象,foo将是一个平面数组。

答案 2 :(得分:1)

您可以使用Array()

irb(main):012:0> Array(1)
=> [1]
irb(main):013:0> Array([1])
=> [1]