【问题标题】:Only calling a method if a hash is populated仅在填充哈希时才调用方法
【发布时间】:2012-06-12 03:33:50
【问题描述】:

我有一个名为

的实例变量
@filtered_ratings = params[:ratings].keys 

但是,如果 params[:ratings] 为 nil 并且在其上调用 #keys,则会引发错误。如果@filtered_ratings 为零,我希望将@filtered_ratings 设置为一个空数组(或哈希)。有没有一种简单的方法可以在没有太多代码的情况下做到这一点?谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 hash conditional


    【解决方案1】:
    @filtered_ratings = params[:ratings].keys if params[:ratings].respond_to? :keys
    

    编辑:

     # if params[:ratings] is nil then return []
     @filtered_ratings = params[:ratings].try(:keys) || []
    

    【讨论】:

    • 我应该措辞更好。如果@filtered_ratings = params[:ratings].keys 为零,我希望将@filtered_ratings 设置为空数组(或哈希)。很抱歉造成混乱!
    • @Dylan..如果你想将@filtered_ratings设置为一个空数组,你应该使用这个@filtered_ratings = (params[:ratings] || {}).keys
    【解决方案2】:

    我会使用 andand gem,因为我已经习惯了:

    @filtered_ratings = params[:ratings].andand.key
    

    这会将@filtered_ratings 设置为nil,或者键值——可能是也可能不是你想要的。

    【讨论】:

    • Rails 有#try。 (在我看来)仅仅为此捆绑一个宝石太麻烦了。但如果你还是捆绑它...... :)
    • @SergioTulentsev 如果是单次使用,我不会。我更喜欢它的可读性,当我伤透 Demeter 的心时,它对我来说更干净 :) 我也做了足够多的非 Rails Ruby 编码,我只是习惯于使用它而不重写公认的微不足道、更短的替换.
    • @DaveNewton 非常有趣的宝石 - 到时候我会记住的。
    【解决方案3】:

    试试这个:

    @filtered_ratings = params[:ratings].try(:keys)
    

    如果params[:ratings]nil,它也会返回nil(而不是引发错误)。

    此外,您当然可以在空哈希 ({}) 上调用 #keys。但是nil 不是一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 2017-06-21
      • 2021-05-28
      相关资源
      最近更新 更多