Ruby动态类。 如何修复“警告:来自toplevel的类变量访问”
我正在尝试编写一个程序,根据从文件中读取的配置动态定义ruby类。 我知道我可以使用Class.new来做到这一点。 这是一个示例程序:
x = [1,2,3] Test = Class.new do @@mylist = x def foo puts @@mylist end end Test.new.foo
当我运行它时,我得到以下输出(与ruby 1.9.3p0一起运行):
c:/utils/test.rb:4:警告:来自toplevel的类变量访问 c:/utils/test.rb:7:警告:来自toplevel的类变量访问 1 2 3
有谁知道导致这些警告的原因以及如何摆脱这些警告?
我已经尝试更换线路了
@@mylist = x
有了这个
class_variable_set(:@@mylist, x)
但是当我这样做时,我得到了这个错误:
c:/utils/test.rb:7:警告:来自toplevel的类变量访问 c:/utils/test.rb:7:在`foo'中:未初始化的类变量@@ mylist in Object(NameError) 来自c:/utils/test.rb:11:in''
提前致谢!
只是要删除此警告,您应该使用class_variable_set
方法:
x = [1,2,3] Test = Class.new do class_variable_set(:@@mylist, x) def foo puts @@mylist end end
这不是你认为它正在做的事情。 由于您没有使用class
关键字创建类,因此您的类变量将在Object
上设置,而不是在Test
。 这种影响非常大,这就是Ruby警告你的原因。 类变量在祖先之间共享,而对象通常从Object
inheritance。
在声明类时,不是在类上定义“mylist”类变量,而是可以稍后在其上声明类级变量,如下所示。 显示了两种不同的方法。 前者仅适用于1.9,后者适用于两种版本,但不太惯用。
x = [1,2,3] Test = Class.new do def foo puts @@mylist end end # ruby 1.9.2 Test.class_variable_set(:@@mylist, x) # ruby 1.8.7 Test.class_eval { @@mylist = x } Test.new.foo
如果你只想抑制这个警告,你可以使用
$VERBOSE = nil
在你的代码顶部