Ruby 作用域问题,选项解析

标签 ruby

所以我正在使用很棒的 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/

相关文章:

ruby - 传递方法来减少/注入(inject)而不是阻塞

Ruby 和 SWIG 与 CMake

Ruby - 将文件解析为哈希

ruby - 显示具有特定大小写的实例变量

ruby-on-rails - rake 任务在另一个项目中执行 bundle 安装

ruby - "In Ruby there' 做同一件事的方式不止一种”——这是什么意思?

ruby-on-rails - 从 Ruby on Rails 调用 Gephi

ruby-on-rails - 如何在我的 Rails 应用程序 View 中指定销毁路径助手?

ruby - 在 Ruby 中使用 HTTPClient 重定向到非 https 资源错误

ruby-on-rails - 在 Ruby 中循环遍历数组