2016-08-29 5 views
0

私はこのようになりますクラスを持っている:RoRの配列のようなattr_reader変数にアクセスすることは可能ですか?

class AwsAssets 
    attr_reader :AWS_INSTANCE, :AWS_INSTANCE_RESERVATION, :AWS_AVAILABILITY_ZONE 

    @@AWS_INSTANCE = 1 
    @@AWS_INSTANCE_RESERVATION = 2 
    @@AWS_AVAILABILITY_ZONE = 3 
end 

私は別のファイルにこれらの変数IDをアクセスしようとしています。私はこの線に沿って何かをしたい:私は何とかすべてattr_reader変数にアクセスできるかどう

def index 
    types = AwsAssets.attr_reader 
    @filter = "model_type_id NOT IN (#{types.join(', ')})" 
end 

これは明らかに正しい構文ではありません、私は思ったんだけど - 私はちょうどすべての属性を入れることができます実現します配列に入れてください。ただし、複製する必要がある100個の変数がありますが、これはやりません。

答えて

1

ので、私はないです:

class AwsAssets 
    # define your attributes here in a constant which is accessible from other classes 
    ATTRIBUTES = [:AWS_INSTANCE, :AWS_INSTANCE_RESERVATION, :AWS_AVAILABILITY_ZONE] 

    # use the definition above to call `attr_reader` for each attribute in the array 
    ATTRIBUTES.each { |attribute| attr_reader(attribute) } 
    # OR a shortcut: attr_reader(*ATTRIBUTES) 
end 

def index 
    # You can now access that array of attributes in other areas like so 
    types = AwsAssets.ATTRIBUTES 
    @filter = "model_type_id NOT IN (#{types.join(', ')})" 
end 

ここではいくつかのより多くの例とRubyにおけるメタプログラミングの詳細については、優れたリソースですどちらを使用したいかを確かめてください。あなたは@@でクラス変数を作成する場合、あなたはこのクラスのために、すべて同じ値を持つことになりますが、クラスのインスタンス変数に

class AwsAssets 
    @AWS_INSTANCE = 1 
    @AWS_INSTANCE_RESERVATION = 2 
    @AWS_AVAILABILITY_ZONE = 3 
end 

AwsAssets.instance_variables 
# => [:@AWS_INSTANCE, :@AWS_INSTANCE_RESERVATION, :@AWS_AVAILABILITY_ZONE] 
AwsAssets.instance_variable_get "@AWS_INSTANCE" 
# => 1 

を使用するかは、クラス変数

class AwsAssets 
    @@AWS_INSTANCE = 1 
    @@AWS_INSTANCE_RESERVATION = 2 
    @@AWS_AVAILABILITY_ZONE = 3 
end 

AwsAssets.class_variables 
# [:@@AWS_INSTANCE, :@@AWS_INSTANCE_RESERVATION, :@@AWS_AVAILABILITY_ZONE] 
AwsAssets.class_variable_get "@@AWS_INSTANCE"" 
# => 1 

を使用することができます

サブクラス。 @でクラスインスタンス変数を使用すると、親クラスとサブクラスで異なる値を持つことができます。

1

メタプログラミングによっては、ここで役立つものがあります。あなたは、クラスに定義することができる性質の異なる混合カップルあなたのコードでIntroduction to Ruby Meta-Programming Techniques

関連する問題