Ruby命令行解析

Ruby命令行解析,ruby,parsing,command-line,command-line-arguments,Ruby,Parsing,Command Line,Command Line Arguments,为什么调用test()时@options返回nil 我还尝试在首次调用Trollop时将@options设置为instance。我需要能够将从Trollop返回的选项散列传递到类中的不同方法。这里有一个范围问题@options是该类的实例变量。在test中,访问当前实例中的实例变量@options。尝试常量,即具有词法范围的选项。也许其他人知道一个更干净的解决方案。正如所指出的,将@options更改为options是一种方法 您也可以使用@@options在任一上下文中它都是一个类变量。如果您

为什么调用
test()时
@options
返回
nil


我还尝试在首次调用Trollop时将
@options
设置为instance。我需要能够将从Trollop返回的选项散列传递到类中的不同方法。

这里有一个范围问题<类上下文中的code>@options
是该类的实例变量。在
test
中,访问当前实例中的实例变量
@options
。尝试常量,即具有词法范围的
选项
。也许其他人知道一个更干净的解决方案。

正如所指出的,将
@options
更改为
options
是一种方法


您也可以使用
@@options在任一上下文中它都是一个类变量。

如果您确实想将类实例变量用于选项存储,那么这将起作用:

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
类测试
@选项=Trollop::选项。。。

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

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

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

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

感谢类变量发挥了很大作用,我原以为所有方法都可以访问实例变量。@JamesParker是的,所有方法都可以访问实例变量,但您创建了一个类实例变量。这是有区别的。要创建实例变量,通常在实例方法
def foo@实例_var=123;结束
。您所做的是在任何方法外部创建变量,但在class=class实例变量内部。看到区别了吗?非常感谢类变量的工作,我认为实例变量可以在所有方法中访问。非常感谢类变量的工作,我认为实例变量可以在所有方法中访问。
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