我有这段代码
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
输入。
但是当我使用4
或nil
时使用return @arr[0]
时,我得到[nil]
。当我仅返回return @arr[0,1]
时,结果类似于@arr
,即使[12, nil]
仅返回@y
或@x
,但无法解决我的问题。我怎样才能做到这一点?
答案 0 :(得分:3)
该行
@arr = [@x, @y]
并没有像你认为的那样做得很好。它不会创建Array
维护对变量@x
,@y
的引用。相反,它会创建一个Array
,其中包含@x
和@y
的当前值。 (见脚注)
因此,当您更改@x
或@y
指向的对象时,如同@x = a * b
行一样,这不会影响@arr
。
如果要返回包含最终值@x
和@y
的数组,那么简单修复就是在结尾处构造并返回该数组,以便返回它。为了做到这一点,你可能根本不需要@arr
。
只需
return [@x, @y]
会这样做。如果那是在你的方法的最后,那么省略return
并且只有
[@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' )
),您可以使用该技术在开始时设置返回结构并进行调整。