【问题标题】:Rails / simplifying syntax when comparing nil or not elements比较零或非元素时的Rails /简化语法
【发布时间】:2016-01-29 00:57:46
【问题描述】:

具有以下条件,其中invitation_sent_at 可以为零:

if self.invitation_last_sent_at + 1.hour
    #then do something
end

我最终写了以下内容:

if (self.invitation_sent_at.presence && (self.invitation_sent_at + 1.hour) ...

我想知道是否有更简洁的语法来处理 self.invitation_sent_at 可能为 nil 的事实,但不必如此冗长地验证它是否存在

【问题讨论】:

    标签: ruby-on-rails if-statement syntax


    【解决方案1】:

    您可以使用新的运算符 &.孤独的运算符),就像 .try! 在 Rails 中的工作方式一样。

    if self&.invitation_last_sent_at&.+1.hour
        #then do something
    end
    

    此功能最近才于 2015 年 12 月在 Ruby 2.3 中添加。

    来源:https://www.ruby-lang.org/en/news/2015/12/25/ruby-2-3-0-released

    【讨论】:

    • 语法有点奇怪!但我想我遇到的问题已经不是那么聪明了。很高兴知道,谢谢
    • 我不知道,但我想它背后的想法是 run .method1 (& 如果可行的话) .method2 (& 如果可行的话) .method3
    【解决方案2】:

    按照您显示的方式在条件表达式中使用+ 运算符没有任何意义(不存储结果)。

    if invitation_sent_at
      # do something
    end
    

    等价于

    if invitation_sent_at && (invitation_sent_at + 1.hour)
      # do something
    end
    

    在这两种情况下,当invitation_sent_at 不为 nil 时,将执行分支,并在值为 nil 时跳过。

    【讨论】:

      【解决方案3】:

      如果担心invitation_sent_at 可能为零,您可以删除#presence 并直接写:

      if self.invitation_sent_at && self.invitation_sent_at + 1.hour
      

      【讨论】:

      • 好的;没有什么可以万无一失地允许省略第一次验证?
      • 是的,您可以使用#try,或者在下面的另一个答案中描述的更好的孤独运算符,安全地尝试将 1.hour 添加到 nil。但下面的答案也是正确的,你实际上并没有在这里做任何事情——将 1.hour 添加到invitation_sent_at,然后将结果扔掉。邀请发送的值仍然是相同的。如果你想存储你可以做的值new_val = invitation_sent_at&.+1.hour
      【解决方案4】:

      试试

      self.invitation_sent_at.blank? ? "" : (self.invitation_sent_at + 1)...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 2012-09-01
        • 2014-12-17
        相关资源
        最近更新 更多