【问题标题】:Is there a shorthand way to check for presence before assigning a variable in ruby?在 ruby​​ 中分配变量之前,是否有一种速记方法来检查是否存在?
【发布时间】:2016-10-26 22:46:57
【问题描述】:

有没有更短的方法来做到这一点(考虑到a 已经设置为某个值):

a = b if b.present?

我以前可能遇到过这样做的方法,但不记得了。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4.2 ruby-2.0


    【解决方案1】:

    a = b if b.present? 本身在功能上等同于:

    if b.present?
      a = b
    else
      a = nil
    end
    

    所以你可以使用Object#presence:

    存在()
    如果接收者存在则返回接收者,否则返回nilobject.presence 相当于

    object.present? ? object : nil
    

    像这样:

    a = b.presence
    

    如果a 已经有一个值并且你真的在说:

    a = something_interesting
    a = b if b.present?
    

    那么你可以说:

    a = b.presence || something_interesting
    

    【讨论】:

      【解决方案2】:

      如果 b 是一些您只想计算一次的复杂表达式,您可以使用

      a = b.presence || a

      【讨论】:

        【解决方案3】:

        你可以这样做

        a = b if !b.nil?
        

        a = b if b
        

        a = b if b != nil
        

        present? 的作用在于它可以保护您免受空数组、散列和其他集合的陷阱。因此,如果您不担心空集合,这些将起作用。

        【讨论】:

        • 最后一个强调与其他人相同,或者是 OP 要求的。 a ||= b 更类似于a = b unless a 而不是a = b if b,这是一个非常不同的含义。
        • 是的,你是对的,因为没有迹象表明这是一个初始分配。
        【解决方案4】:

        您可以使用||= 运算符,但这取决于您希望代码执行的操作。如果b不是nil,则此运算符将b的值分配给a。例如,如果a = 5并执行以下操作a ||= bb的值分配给a 仅当b 不是nil,但如果a 之前未声明a 的值将是nil 对于此代码a ||= b

        示例:

        irb(main):001:0> b = nil
        => nil
        irb(main):002:0> a ||= b
        => nil
        irb(main):003:0> b = 5
        => 5
        irb(main):004:0> a ||= b
        => 5
        irb(main):005:0> a ||= nil
        => 5
        

        【讨论】:

          【解决方案5】:

          ||= 运算符是您正在寻找的。它在赋值之前检查操作数是否为 nil 或存在。如果 present 不赋值,如果 nil 或 undefined 将赋值。

          [1] pry(main)> a
          NameError: undefined local variable or method `a' for main:Object
          from (pry):1:in `__pry__'
          [2] pry(main)> a ||= 100
          => 100
          [3] pry(main)> a = nil
          => nil
          [4] pry(main)> a ||= 100
          => 100
          [5] pry(main)> a ||= 200
          => 100
          

          【讨论】:

            猜你喜欢
            • 2014-10-08
            • 2014-12-19
            • 1970-01-01
            • 2010-10-09
            • 2019-11-13
            • 2012-09-07
            • 1970-01-01
            • 1970-01-01
            • 2014-02-03
            相关资源
            最近更新 更多