Ruby范围问题,选项解析
因此,我使用awesomeRuby范围问题,选项解析,ruby,Ruby,因此,我使用awesometrollopgem来进行选项解析,但它设置的变量范围存在一个普遍问题 require 'trollop' class MyClass opts = Trollop::options do opt :thing, "does something", default: "blah", type: String end def my_method puts opts[:thing] end end 但我得到: undefined loc
trollop
gem来进行选项解析,但它设置的变量范围存在一个普遍问题
require 'trollop'
class MyClass
opts = Trollop::options do
opt :thing, "does something", default: "blah", type: String
end
def my_method
puts opts[:thing]
end
end
但我得到:
undefined local variable or method `opts' for #<MyClass:0x0000010203c840> (NameError)
未定义的局部变量或#的“opts”方法(NameError)
你知道我的作用域哪里做错了吗?你不应该只使用实例变量吗
require 'trollop'
class MyClass
def initialize
@opts = Trollop::options do
opt :thing, "does something", default: "blah", type: String
end
end
def my_method
puts @opts[:thing]
end
end
根据需要,您可以将其设置为类变量或实例变量。您正在将“opts”定义为类内的局部变量。实例方法(如my_方法)将无法访问它。全班的选项应该是“全局”的吗?在这种情况下:
class MyClass
@@opts = Trollop::options...
def my_method
puts @@opts[:thing]
end
end
或者类的每个实例都应该有一个唯一的实例
class MyClass
def initialize
@opts = Trollop::options...
end
def my_method
puts @opts[:thing]
end
end
这可能是一个很好的阅读:这里大约有六个选项:实例变量、类实例变量、类变量、类常量、全局变量、全局常量。使用哪种取决于您的需要 实例变量-每个MyClass实例都有自己的选项:
class MyClass
def initialize
@opts = ...
end
def my_method
puts @opts[:thing]
end
end
类实例变量-可在类中重新分配的单个值:
class MyClass
@opts = ...
class << self
attr_accessor :opts
end
def my_method
puts self.class.opts[:thing]
end
end
类常量-可变异但不重新分配的单个对象。可从此类轻松访问,其他人可通过MyClass::OPTS
:
class MyClass
OPTS = ...
def my_method
puts OPTS[:thing]
end
end
全局变量-您在整个应用程序中只能使用其中一个变量;通常,全局变量是不明智的,但可能适用于独立应用程序的选项:
$opts = ...
class MyClass
def my_method
puts $opts[:thing]
end
end
全局常数-从许多类访问,不能设置为新值,但可能会发生变化:
OPTS = ...
class MyClass
def my_method
puts OPTS[:thing]
end
end
仅供参考:@@2对类来说不是全局的,它对继承层次结构来说是全局的。因此,如果Foo
OPTS = ...
class MyClass
def my_method
puts OPTS[:thing]
end
end