Ruby:解析条件数组元素的最佳方法

时间:2011-05-21 02:23:23

标签: ruby arrays

我正在进行API调用,它会有条件地返回几个不同的元素。我的代码目前是:

if array['productId']
  value = array['productId'][0]
end

我觉得有一种更简洁的方法可以做到这一点。一些Ruby魔术。

9 个答案:

答案 0 :(得分:4)

更好的方法:

value = array['productId'][0] if array['productId']

然而,array ['productId'] [0]并不是天生的红宝石。你的数组是由什么组成的?

答案 1 :(得分:1)

我不确定您是暂时使用value还是稍后实际使用它,以及当条件不满足时您想要使用value做什么。如果您想返回nil缺少密钥,那么

array['productId'].to_a[0]

可以工作。否则,SpyrosP的答案将是最好的。

答案 2 :(得分:1)

这可能有点迂腐,但为了确保它适用于所有情况,你不应该检查'not-nil',而是它是可索引的;像这样的东西:

value = array['productId'][0] if array['productId'].is_a? Array

甚至更好:

value = array['productId'][0] if array['productId'].respond_to? '[]'

否则,如果array['productId'] == 2(另一方面,如果使用了密钥,我会改为product_ids,那么你的代码将失败)。

答案 3 :(得分:0)

你可以使用三元:

   value = array['productId'].nil?  ? nil : array['productId'][0]

答案 4 :(得分:0)

您的代码模式看起来不错;它可能会稍微缩短......

value = (t = x['productId']) && t[0]

答案 5 :(得分:0)

使用Ick可能模式,简洁明了:

value = array['productId'].maybe[0]

答案 6 :(得分:0)

虽然我认为您的代码很好(虽然我更喜欢SpyrosP的单行版本),但您有一些可能性:

  • Rails有Object#try,可让您array['productId'].try(:[], 0)array['productId'].try(:at, 0)

  • 有些人喜欢andand gem,它定义Object#andand并使用array['productId'].andand[0]

答案 7 :(得分:0)

哈,我喜欢这里的所有选择。但由于我没有看到我最常用的东西,我还会再添加一个!

value = array['productId'] && array['productId'].first

(我更喜欢.first[0],因为它看起来更好一些)

这假设你在array['productId']中有一个数组,这是正确的方法(而不是类型检查)。

否则,此与原始代码之间的最大差异在于,如果数组中没有任何内容,则会导致value分配nil,而原始结果为{{ 1}}未被定义(可能会导致错误,具体取决于您如何使用它)。

希望有所帮助!

答案 8 :(得分:0)

从Ruby 2.3.0开始,最短的方式是Array#dig

array.dig('productId', 0)

http://ruby-doc.org/core-2.3.0_preview1/Array.html#method-i-dig