Ruby - 变量在一个地方递增,但在另一个地方显示为默认值

时间:2015-07-23 20:23:32

标签: arrays ruby global-variables

我声明$ a,稍后,在循环中,我递增它然后将其传递给小部件,但是,当我看到输出小部件正在生成时,$ a是永久的1.我如何能够存储数学在数组中使用循环递增的$ a?

请原谅新手代码的味道 - 这也是我正在构建的一个非常愚蠢的版本,这是尝试解决Project Euler#128

    $a = 1
    $arr = Array.new
    $step1 = [1, $a-1, -1]
    $step2 = [$a+6, -5, 2]

    def widget(t,u,v)
        t.each do |math|
            $arr.push (v+math)/u
        end
    end
    (1..100).each do |num|
        if num % 2 == 0
            $a += 1
        end
    if [something]
        widget($step1,$a,num)
    elsif [something else]
        widget($step2,$a,num)
    end

2 个答案:

答案 0 :(得分:1)

使用全局变量很难阅读代码,但我注意到$step1$step2在任何$a增量之前被评估,因此它们的值实际上是一个常数,用$ a == 1:

计算
$step1 = [1, 0, -1] # [1, (1)-1, -1] 
$step2 = [7, -5, 2] # [(1)+6, -5, 2]  

如果这不是所需的行为,那么您应该在if [something]之前立即移动这两个语句,或者将step1和step2从全局变量转换为函数。

答案 1 :(得分:0)

问题是声明一个等于另一个变量某些操作的变量使用该变量的当前值。

a = 1
  # => 1
b = a
  # => 1
a = 2
  # => 2
puts b
  # => 1

b变量不包含“a”的值作为排序的占位符,它在a处保留当前值时间b已初始化:1。

您需要在使用$step1$step2变量之前重新评估这些变量,以便将$a的当前值考虑在内。

OR

您可以编写方法step1step2,它们都将$a作为参数,并根据$a的当前值返回一个数组。