我是Ruby的新手,我正在尝试理解我遇到过的行为。我正在编写一个类,它需要在运行之前初始化一些常量,但是当它从另一个类运行时,就像它有时一样,我会得到关于已经定义的常量的警告。所以我在文件的末尾添加了以下内容:
if __FILE__ == $0
constant_initialiation
ReviewScraper.new.getReviews($testing, $getWeekendReviews, $clearWorksheet, $getAll)
end
constant_initialization
只是一堆常量被设置,没有什么有趣的。无论如何,这对我来说很有用 - 只要它在文件的末尾。如果我将其移到顶部并尝试运行,则会收到错误:unitialized constant ReviewScraper (NameError)
。几乎就像它只为文件的这一部分顺序编译一样,并且在运行时没有找到ReviewScraper类定义。
任何Ruby天才都可以向我解释这种行为吗?除了造型之外,这不是什么大问题(我喜欢把我的常量列表放在首位),但是理解这里发生的事情会很好。
答案 0 :(得分:1)
首先,我将扩展我上面的评论,了解发生了什么。其次,我建议可能有更好的方法在代码中设置常量,避免多次设置它们。
正如我所提到的,Ruby脚本从上到下读取。因此,如果您尝试在之前实例化一个类,则定义它,Ruby脚本将不知道它是什么。
cat = Cat.new # NameError
class Cat
# Code
end
cat = Cat.new # Works fine
该脚本首先读取您创建新Cat
对象的行。但是,它还不知道Cat
到底是什么。完成Cat
的处理代码后,就可以创建一个代码。我用了一个与Darth Vader谈话的例子,但它可能更像是在你给他们提供蓝图之前要求建筑公司建造你的建筑。只有在他们有蓝图之后,他们才能建造你的建筑。
现在,关于初始化常量,你可以做几件事。一个是,你可以将初始化放在if块中,就像你在顶部做的那样,但是在脚本结束之前省略了类的实例化。 (两个if语句。)另一个是将常量放在一个模块中。
module Names
Dog = "Spot"
Cat = "Sparkles"
end
现在您只需要在任何需要的地方使用该文件。在file_one.rb中你放了
require_relative './modules/names_module.rb' # Or wherever it is
include Names
您在Review Scraper文件中添加了相同的内容。这是很酷的部分:如果你需要Names模块一次,它将被带入代码中。但是,如果您第二次需要,则不会发生任何事情。你不会收到警告。它会悄然不再需要它。其中最重要的是,所有常量都在自己的命名空间中。
只是一个想法。