所以我正在使用很棒的 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)
知道我的示波器做错了什么吗?
最佳答案
这里大概有六个选项:实例变量,类实例变量,类变量,类常量,全局变量,全局常量。使用哪个取决于您的需要。
实例变量 - 每个 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 和所有子类共享相同的值(方便的语法,但很少是个好主意):
class MyClass
@@opts = ...
def my_method
puts @@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
关于Ruby 作用域问题,选项解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7410179/