0
class Test

    options = Trollop::options do
        opt :mode, "Select script mode", :default => 0
        opt :net, "Internal IP range", :type => :string
    end

@options = options

    def test
        pp @options
    end
end

为什么我打电话时@options返回?niltest()

我还尝试@options在第一次调用 Trollop 时设置为实例。我需要能够将从 Trollop 返回的选项哈希传递到类中的不同方法中。

4

4 回答 4

1

如果您真的想使用类实例变量来存储选项,那么这将起作用:

class Test
   @options = Trollop::options ...

   class << self
     attr_accessor :options
   end

   def test
     pp Test.options
     # or self.class.options
   end
 end

 # And this will work too..
 pp Test.options

否则,您可能想要使用类变量@@options或常量,就像其他人指出的那样。

于 2013-01-29T20:47:05.010 回答
0

你在这里有一个范围问题。@options在类上下文中是类的实例变量。在test中,您访问当前实例中的实例变量@optionsOPTIONS尝试具有词法作用域的常量,即 aka 。也许其他人知道对此有更清洁的解决方案。

于 2013-01-29T20:34:44.027 回答
0

正如Tass指出的那样,更改@optionsOPTIONS是一种方式。

您也可以@@options;在任一上下文中使用它作为类变量。

于 2013-01-29T20:43:38.713 回答
0

您正在添加一个类实例变量,但是当您在方法中引用它时,您正在引用看起来像实例变量的东西。

首先,您可能希望使用类变量而不是类实例变量。这里有一些关于区别的信息。

class Test

    @@options = Trollop::options do
        opt :mode, "Select script mode", :default => 0
        opt :net, "Internal IP range", :type => :string
    end


    def test
        pp @@options
    end
end

Test.test

另一种选择是在初始化测试对象时实例化您的类变量,如下所示:

class Test

    def initialize
        @options = Trollop::options do
            opt :mode, "Select script mode", :default => 0
            opt :net, "Internal IP range", :type => :string
        end
    end


    def test
        pp @options
    end
end

t = Test.new
t.test
于 2013-01-29T20:49:57.877 回答