【问题标题】:Ruby assignment with if expression yields nil使用 if 表达式的 Ruby 赋值产生 nil
【发布时间】:2012-08-13 21:04:16
【问题描述】:

在 Ruby 中,如果 myfunction1 返回非零值,我的函数 func 返回 nil。我会以某种方式期望func 返回rc 的值。换句话说,即使它没有执行,它也会获得赋值的值:

def func
    rc = myfunction1
    rc = myfunction2 if rc.nil?
end

如果我将func 增强到这个值,那么func 会像我预期的那样工作:

def func
    rc = myfunction1
    rc = myfunction2 if rc.nil?
    rc
end

这里是简化版,你自己试试吧:

def func
    rc = 3
    rc = myfunction2 if rc.nil?  # returns nil but rc has value 3
end

这种行为是否有具体原因?

【问题讨论】:

    标签: ruby if-statement expression variable-assignment


    【解决方案1】:

    让我们逐步了解您的简化示例:

    1. 您将 rc 设置为 3。
    2. 在下一行中,检查rc 是否为nil,显然不是。
    3. 因此不会执行赋值,并且由于没有else 分支,表达式的计算结果为nil
    4. 因为这是方法中的最后一个表达式,所以会返回 nil

    如果你想在任何情况下返回rc,你必须求助于你的第二种形式或者像这样编写整个方法:

    def func
      myfunction1 || myfunction2
    end
    

    这显然只有在false 不是myfunction1 的可能返回值时才有效。如果是,您可以这样做:

    def func
      rc = myfunction1
      rc.nil? ? myfunction2 : rc
    end
    

    【讨论】:

      【解决方案2】:
      if cond then expr end
      

      如果 cond 为假则返回 nil,如果 cond 为真则返回 expr 的值。

      if cond then expr_if else expr_else end
      

      如果 cond 为 false,将返回 expr_else。

      这就是为什么一个人可以做(例如)

      value = if den != 0 then
               val / den
            else 0
            end
      

      【讨论】:

        【解决方案3】:

        在您对func 的第一个定义中,最后一行没有定义ifelse 部分,因此它相当于:

        if rc.nil? then
          rc = function2
        else
          nil
        end
        

        您可以使用保护子句来达到您想要的结果:

        def func
          rc = function1
          return rc unless rc.nil?
          function2
        end
        

        【讨论】:

          猜你喜欢
          • 2021-11-23
          • 2013-04-21
          • 1970-01-01
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多