2012-02-02 6 views
5

皆さん、私はRubyを学んでいて、最近JAVAから移動しました。 JAVAでは、クラスのメンバー変数を静的にすることができ、そのメンバー変数はクラスのインスタンス間で同じままになります。私はどのようにルビーでこれを達成するのですか?Rubyのクラスメソッド(JAVAのstaticと同等)

class Baseclass 

    @@wordshash 

end 

これは、私はこれをテストしていながら、それはwordhashは、基底クラスのインスタンスで同じまま@@で、これまでの目的を果たすようだ:私は私のRubyのクラスでこのような何かをしました。私の理解は正しいのですか?

また、JAVAの静的メソッドと同等のメンバメソッドをクラスに持たせたい(これにアクセスするためにクラスのインスタンスを持つ必要はありません)。これどうやってするの? 。

class Baseclass 

    @@wordshash 

    #static or class method 
    def getwordhash() 
    return @@wordshash 
    end 
end 

:たとえば、私はこのようなので、何か)基底クラス(のインスタンスを作成する必要はありません@@ wordshash及びその方法をユーザーに返しgetwordshashのような基本クラス()のメソッドを持つようにしたいですこれは非常に素朴な質問であれば、その後、私は謝罪

#without making an instance 
@hash = Baseclass.getwordhash() 

ように私はそれを使用することができ、私は、Rubyのは本当に新しいなく、学ぶことは非常に興奮しています。 Ruby and Rails Naming Conventions

答えて

7
def self.getwordhash 
    @@wordshash 
end 

class Baseclass 

    @@words_hash = Hash.new 

    def self.words_hash 
    @@words_hash 
    end 
end 
+2

実際には、コンベンションには通常このタイプはありません。 '@@ words_hash'ではなく' @@ words'になります。 –

12

静的店は、サブクラスで結果を意図しないたようにクラス変数を使用します。インスタンス変数をクラスレベルで宣言することで、静的ストアを簡単に実装できます。

class Foo 

    # initialize a static variable 
    @names = ['Tom', 'Dick', 'Harry'] 

    # class method (notice the self. prefix 
    def self.names 
    @names 
    end 

    # instance methods 

    def names 
    @names 
    end 

    def names=val 
    @names = val 
    end 

end 

私たちは、私たちは私たちは、インスタンス変数を設定して、再度

>> f.names=["Bob", "Danny"] 
=> ["Bob", "Danny"] 

>> f.names 
=> ["Bob", "Danny"] 
を、それを印刷してみましょう

インスタンスに変数

>> f = Foo.new 
>> f.names 
=> nil 
を印刷してみましょう静的な名前

>> Foo.names 
=> ["Tom", "Dick", "Harry"] 

を印刷してみましょう

印刷しましょう静的変数をもう一度

>> Foo.names 
=> ["Tom", "Dick", "Harry"] 

私は用語「static」をゆるく使用します。実際、両方の変数はインスタンス変数です。クラスコンテキストで宣言された@namesは、Fooクラスオブジェクトのインスタンス変数であり、メソッド内の@namesは、Fooクラスのインスタンス変数です。タイプFooを表すオブジェクトが1つ存在するため、クラスコンテキストで宣言された@namesは静的変数とみなされます。

+0

これらの準クラスのインスタンス変数へのアクセスのために 'attr_accessor'という略式表現をいくつか使用することは可能ですか? –

+1

@DennisHodapp 'cattr_accessor'と' mattr_accessor'メソッドを使ってみましたか? –

+0

いいえ私はそうではありませんが、それらのアクセサはレールの拡張であり、Rubyアプリケーションのためにそれらをインポートする必要はありません。 –

関連する問題