[英]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 * num
和nil.to_i
等於0,因此在隨后的循環迭代中將result
設置為0,因為您乘以result的值保持為0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.