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

Ruby - variable is incremented in one place, but shows as default in another

我声明 $a,然后在循环中,我递增它然后将它传递给小部件,但是,当我查看正在生成的输出小部件时,$a 永远为 1。我怎样才能得到存储在数组中的数学与循环递增的 $a?

请原谅新手代码的味道——另外,这是我正在构建的一个非常精简的版本,它试图解决欧拉项目 #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

全局变量的使用使得代码很难阅读,但我注意到 $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 从全局变量转换为函数。

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

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

b 变量不包含 "the value of a" 作为某种占位符,它包含 a 当前 值时间 b 初始化:1.

您需要在使用 $step1$step2 变量之前对其重新赋值,以便将 $a 的当前值考虑在内。

您可以改为编写方法,step1step2 都将 $a 作为参数,而 return 是基于 [= 的当前值的数组17=]。