返回为数组

时间:2016-03-18 19:23:20

标签: ruby

我有这段代码

class Test
  def self.testme(a, b)
    @arr = [@x, @y]
    if (a == 0)
      if (b == 0)
        return nil
      else
        @x = a * b
        return @arr[0]
      end
    end
    ...# @y needed in other part below
  end
end

并希望返回具有相应值的数组(结果为@x@y),以便[12]和{{1}时结果为3输入。

但是当我使用4nil时使用return @arr[0]时,我得到[nil]。当我仅返回return @arr[0,1]时,结果类似于@arr,即使[12, nil]

中应该存在某些内容

仅返回@y@x,但无法解决我的问题。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:3)

该行

@arr = [@x, @y]

并没有像你认为的那样做得很好。它不会创建Array 维护对变量@x@y的引用。相反,它会创建一个Array,其中包含@x@y当前值。 (见脚注)

因此,当您更改@x@y指向的对象时,如同@x = a * b行一样,这不会影响@arr

如果要返回包含最终值@x@y的数组,那么简单修复就是在结尾处构造并返回该数组,以便返回它。为了做到这一点,你可能根本不需要@arr

只需

return [@x, @y]

会这样做。如果那是在你的方法的最后,那么省略return并且只有

是Ruby惯例
[@x, @y]

如果出于某种原因,您确实需要按照示例维护@arr变量和return @arr[0],那么您需要在返回之前设置@arr,例如< / p>

  else
    @x = a * b
    @arr = [@x, @y]
    return @arr[0]
  end

甚至

  else
    @arr = [a * b, @y]
    return @arr[0]
  end

如果@x应该是方法的内部(在这种情况下,BTW,如果需要保留一些临时工作值,最好只调用它x

脚注:在Ruby中,跟踪变量与它们指向的对象之间的区别非常重要。这是因为您重新分配变量@x,您会看到您所做的结果。当您使用更复杂的对象(如字符串或数组)并在其中到位时(例如,对于String使用@x.gsub!( /foo/, 'bar' )),您可以使用该技术在开始时设置返回结构并进行调整。