Ruby范围问题,选项解析

Ruby范围问题,选项解析,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

因此,我使用awesome
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对类来说不是全局的,它对继承层次结构来说是全局的。因此,如果FooOPTS = ... class MyClass def my_method puts OPTS[:thing] end end