为什么irb中的load / require没有加载局部变量?

时间:2017-07-15 22:21:04

标签: ruby

为什么当我在irb中需要/加载以下文件时,john是一个未定义的变量,但Person存在?是否要求/加载只是在irb会话中运行该文件,所以我不应该同时访问Personjohn

somefile.rb

class Person
end

john = Person.new

1 个答案:

答案 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