如何处理空出的选择?

时间:2014-02-04 15:07:02

标签: ruby arrays hash

如果0在搜索哈希数组时出现空白,我将如何处理返回select

我有以下几行在哈希数组中查找created键:

array.select{|key| key[:created] == Date.yesterday }.first[:amount]

然后,它在找到记录时返回amount键。

问题是,如果找不到key[:created] == Date.yesterday的记录,那么我会收到此错误:

undefined method '[]' for nil:NilClass

以下是哈希数组的样子:

[
   {:created=>"2014-01-20", :amount=>123},
   {:created=>"2014-01-21", :amount=>456},
   {:created=>"2014-01-22", :amount=>789}
]

2 个答案:

答案 0 :(得分:3)

您可以使用find代替selectfind返回满足该块的可枚举中的第一个对象:

found = array.find { |hash| hash[:created] == Date.yesterday }
amount = found ? found[:amount] : DEFAULT_VALUE

如果您使用的是Rails,则可以使用try方法:

array.find { |hash| ... }.try(:[], :amount)

更新:请注意,StringDate之间的比较注定要失败,您必须将日期转换为格式正确的字符串,反之亦然。在我的示例中,我假设hash[:created]Date对象。

答案 1 :(得分:0)

我使用的习语是

res = array.select{|key| key[:created] == Date.yesterday }
res.blank? ? nil : res.first[:amount]

当然,它不是一个漂亮的衬垫,但它防御零。我认为blank?是主动支持的一部分,但你可以轻松自己动手。