0

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

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

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

4

3 回答 3

2

让我们逐步完成您的简化示例:

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

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

def func
  myfunction1 || myfunction2
end

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

def func
  rc = myfunction1
  rc.nil? ? myfunction2 : rc
end
于 2012-08-17T12:02:45.493 回答
0
if cond then expr end

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

if cond then expr_if else expr_else end

如果 cond 为假,将返回 expr_else。

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

value = if den != 0 then
         val / den
      else 0
      end
于 2012-08-17T14:14:50.937 回答
0

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

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

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

def func
  rc = function1
  return rc unless rc.nil?
  function2
end
于 2018-09-22T16:40:45.373 回答