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