簡體   English   中英

全局變量還是局部變量?

[英]Global vs local variables?

我想知道為什么我的代碼只能在一個實例中工作而不能在另一個實例中工作。 它與局部和全局變量有關嗎?

這有效:

def factorial num
  result = 1
  while (num > 1)
    result = result * num
    num -= 1
  end
  puts result
end

這不起作用:

result = 1

def factorial num
  while (num > 1)
    result = result.to_i * num
    num -= 1
  end
  puts result
end

方法定義中的所有內容都看不到其他地方的局部變量。 聽起來很奇怪,但是有兩種解決方法:

    result = 1
    number = 10

    def factorial(num,result_value)
      while (num > 1)
        result_value = result_value.to_i * num
        num -= 1
      end
      puts result_value
    end

    factorial(number, result)

將結果作為參數傳遞。 這是處理方法的好方法,因為它不允許您從方法內部更改結果的值。 看起來似乎沒什么大不了,但是隨着代碼的增加,像這樣的“純方法”變得非常有價值。

這是做同一件事的“骯臟”或不純凈的方式:

@result = 1

def factorial(num)
  while (num > 1)
    @result = @result.to_i * num
    num -= 1
  end
  puts @result
end

在變量名前面放置一個@ ,可以將其范圍擴展到其范圍之外定義的方法。 隨着代碼復雜度的增加,這成為一個問題。

個人觀點:盡管Ruby不需要您將括號放在方法定義的旁邊,但您始終應該這樣做。 它使代碼更加明確和易於閱讀。 雖然跟隨你的心;)

您可以通過在所有result前加$符號進行實驗,使其成為全局變量。 以@開頭會產生一個實例變量,這也很有趣。 旁注: puts打印並返回nil ,因此您的方法返回nil

result = 1 # line 1

def factorial num
  while (num > 1)
    result = result.to_i * num 
    num -= 1
  end
  puts result
end

在這段代碼中, factorial不知道第1行的result變量。
當Ruby在您的方法中找到result = result.to_i * num時,它將首先為result分配nil 然后,Ruby將嘗試運行result.to_i * num 由於result已經為nil ,所以result.to_i等於0。

這是另一個示例:

def foo
  a = a
  puts "#{a.class}"
end
foo #NilClass

“不工作”版本中,您分配給1的result變量在factorial方法內不可見。

現在,在Ruby中可能發生了意外的行為,如果您嘗試分配一個變量,並在賦值的右側引用了相同的變量,則如果該變量沒有值,則將其視為nil而不是而不是引發錯誤。 所以當你第一次表演時

result = result.to_i * num

它等效於result = nil.to_i * numnil.to_i等於0,因此在隨后的循環迭代中將result設置為0,因為您乘以result的值保持為0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM