我正在进行API调用,它会有条件地返回几个不同的元素。我的代码目前是:
if array['productId']
value = array['productId'][0]
end
我觉得有一种更简洁的方法可以做到这一点。一些Ruby魔术。
答案 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