Ruby动态类.如何修复"警告:来自toplevel的类变量访问"

yod*_*lex 13 ruby oop warnings dynamic

我正在尝试编写一个程序,根据从文件中读取的配置动态定义ruby类.我知道我可以使用Class.new来做到这一点.这是一个示例程序:

x = [1,2,3]

Test = Class.new do
  @@mylist = x

  def foo
    puts @@mylist
  end
end

Test.new.foo
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到以下输出(与ruby 1.9.3p0一起运行):

c:/utils/test.rb:4: warning: class variable access from toplevel
c:/utils/test.rb:7: warning: class variable access from toplevel
1
2
3

有谁知道是什么导致这些警告以及我如何摆脱它们?

我已经尝试更换线路了

@@mylist = x
Run Code Online (Sandbox Code Playgroud)

有了这个

class_variable_set(:@@mylist, x)
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我得到了这个错误:

c:/utils/test.rb:7: warning: class variable access from toplevel
c:/utils/test.rb:7:in `foo': uninitialized class variable @@mylist in Object (NameError)
        from c:/utils/test.rb:11:in `'

提前致谢!

mcu*_*ulp 19

这不是你认为它正在做的事情.由于您没有使用class关键字创建类,因此您的类变量正在设置Object,而不是Test.这种影响非常大,这就是Ruby警告你的原因.类变量在祖先之间共享,而对象通常从中继承Object.


War*_*Hog 7

只是要删除此警告,您应该使用class_variable_set方法:

x = [1,2,3]

Test = Class.new do
  class_variable_set(:@@mylist, x)

  def foo
    puts @@mylist
  end
end
Run Code Online (Sandbox Code Playgroud)