为什么当我在irb中需要/加载以下文件时,john
是一个未定义的变量,但Person
存在?是否要求/加载只是在irb会话中运行该文件,所以我不应该同时访问Person
和john
?
somefile.rb
class Person
end
john = Person.new
答案 0 :(得分:2)
require / load与将文件复制并粘贴到irb不同。您运行该文件但文件在ruby中有自己的范围。您创建的局部变量john
的范围限定为该文件。这意味着当您定义它时,它在文件中可用,但不在其外部。这是一个很好的功能:假设您有一个不同的文件,可以创建Dog
类并分配john = Dog.new
。当您加载该文件时,它会更改您的第一个文件中john
的分配,从而破坏依赖于john
作为一个人的任何代码。许多Ruby程序包含数百个文件 - 你可以想象这会是多么痛苦。当你有两个方法时,它是一样的
def method1
john = Dog.new
end
def method2
john = Person.new
method1()
puts john
end
我们希望能够定义变量并使用它们执行操作,而不必担心我们调用的其他代码会更改它们。如果您调用method2,您会发现john
仍然是Person
。如果调用其他方法可能会改变您的局部变量,那么就很难推断出发生了什么。
文件中的局部变量仅限于那些文件,就像方法中的局部变量仅限于那些方法一样。如果要在文件外部访问它们,只需使它们成为常量即可。
JOHN = Person.new