首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby作用域问题,选项解析

Ruby作用域问题,选项解析
EN

Stack Overflow用户
提问于 2011-09-14 09:00:34
回答 4查看 326关注 0票数 3

所以我使用了一个很棒的trollop gem来做选项解析,但是我对它设置的变量的作用域有一个普遍的问题。

代码语言:javascript
复制
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

但我得到了:

代码语言:javascript
复制
undefined local variable or method `opts' for #<MyClass:0x0000010203c840> (NameError)

你知道我的瞄准镜哪里做错了吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-14 10:25:59

这里大约有六个选项:实例变量,类实例变量,类变量,类常量,全局变量,全局常量。使用哪一种取决于您的需求。

实例变量-每个MyClass实例都有自己的选项:

代码语言:javascript
复制
class MyClass
  def initialize
    @opts = ...
  end

  def my_method
    puts @opts[:thing]
  end
end

类实例变量-可以重新赋值的类中的单个值:

代码语言:javascript
复制
class MyClass
  @opts = ...
  class << self
    attr_accessor :opts
  end

  def my_method
    puts self.class.opts[:thing]
  end
end

类变量-每个MyClass和所有子类共享相同的值(语法很方便,但很少是一个好主意):

代码语言:javascript
复制
class MyClass
  @@opts = ...
  def my_method
    puts @@opts[:thing]
  end
end

类常量-可以改变但不能重新分配的单个对象。可从该类轻松访问,也可通过MyClass::OPTS从其他类访问

代码语言:javascript
复制
class MyClass
  OPTS = ...
  def my_method
    puts OPTS[:thing]
  end
end

全局变量-您在整个应用程序中只能使用其中之一;通常全局变量是不明智的,但可能适合独立应用程序的选项:

代码语言:javascript
复制
$opts = ...
class MyClass
  def my_method
    puts $opts[:thing]
  end
end

全局常量-从许多类访问,不能设置为新值,但可能会发生变化:

代码语言:javascript
复制
OPTS = ...
class MyClass
  def my_method
    puts OPTS[:thing]
  end
end
票数 4
EN

Stack Overflow用户

发布于 2011-09-14 09:09:55

你不应该只使用实例变量吗?

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2011-09-14 09:12:16

您正在将“opts”定义为类中的局部变量。实例方法(如my_method)将无法访问它。opts是否应该对整个类都是“全局的”?在这种情况下:

代码语言:javascript
复制
class MyClass
  @@opts = Trollop::options...

  def my_method
    puts @@opts[:thing]
  end
end

或者类的每个实例都应该有一个唯一的实例?

代码语言:javascript
复制
class MyClass
  def initialize
    @opts = Trollop::options...
  end

  def my_method
    puts @opts[:thing]
  end
end

这可能是一本不错的读物:http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7410179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档