爲什麼當我在irb中需要/加載下面的文件時,john
是一個未定義的變量,但存在Person
?請求/加載只是在irb會話中運行文件,因此我不能同時訪問Person
和john
?爲什麼irb中的load/require不加載局部變量?
somefile.rb
class Person
end
john = Person.new
爲什麼當我在irb中需要/加載下面的文件時,john
是一個未定義的變量,但存在Person
?請求/加載只是在irb會話中運行文件,因此我不能同時訪問Person
和john
?爲什麼irb中的load/require不加載局部變量?
somefile.rb
class Person
end
john = Person.new
要求/負載是不一樣的直接複製文件粘貼到IRB。你確實運行該文件,但文件在ruby中有自己的作用域。您創建的本地變量john
的範圍是該文件。這意味着當你定義它時,它在文件中可用,但不在其外部。這是一個很好的特性:假設你有一個不同的文件,創建一個Dog
類並分配。當你加載該文件時,它會改變第一個文件中john
的分配,破壞取決於john
的任何代碼。許多Ruby程序包含數百個文件 - 你可以想象這將是如何痛苦的。這是同樣的事情時,你有兩種方法
def method1
john = Dog.new
end
def method2
john = Person.new
method1()
puts john
end
我們希望能夠定義變量,並與他們做的事情,而不必擔心我們稱之爲將改變他們的其他代碼。如果你打電話給method2,你會看到john
仍然是Person
。如果調用其他方法可能會改變你的局部變量,那麼很難推斷髮生了什麼。
文件內部的局部變量僅限於那些文件,就像局部變量一樣,方法僅限於那些方法。如果你想在文件外訪問它們,只需使它們成爲常量。
JOHN = Person.new
謝謝!但是'class'沒有作用於文件? – stackjlei
'class'是一個關鍵字,*必須*給定一個常量。如果你嘗試'上課人;結束'你會得到一個語法錯誤。紅寶石常量是以大寫字母開頭的標識符。 'person'是一個變量'Person'是一個常數。常量與局部變量有不同的詞法範圍:它們可以通過它們在任何子模塊中定義的模塊進行訪問。如果它們在您的示例中在任何模塊之外定義,則它們是全局可用的。 –