2011-09-14 9 views
3

偉大なtrollop宝石を使ってオプションの解析を行っていますが、設定している変数の範囲に一般的な問題があります。Rubyスコープの質問、オプションの解析

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) 

私は私のスコープと間違ってやっている任意のアイデア?

答えて

4

ここについての6つのオプションがあります。どちらを使用するかは、お客様のニーズによって異なります。再割り当てすることができ、クラス全体で単一の値 -

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のインスタンスは、独自のオプションを取得します - 各MyClass とすべてのサブクラスはsaを共有します私値(便利な構文が、めったに良いアイデア):

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 
2

インスタンス変数を使用するべきではありませんか?

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 
1

必要に応じて、クラス変数またはインスタンス変数のどちらかにしたい場合があります。

2

'opts'は、クラス内のローカル変数として定義しています。インスタンスメソッド(my_methodのような)はそれにアクセスすることができません。オプトはクラス全体の「グローバル」なのでしょうか?その場合:

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 

これは良い読み物であるかもしれない:インスタンス変数、クラスのインスタンス変数、クラス変数、クラス定数、グローバル変数、グローバル定数:http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby

+2

FYI:@@は、クラスのグローバルを意味するものではなく、継承階層のグローバルを意味します。したがって、Foo