2013-08-27 11 views
6

ルビーとoopを学ぶのは、私が理解する限り、インスタンスメソッドと似ていますが、オブジェクトからではなくクラスからアクセスされるクラスメソッドです。同時に実行できるクラスメソッドは1つしかありません。ruby​​のクラス/静的メソッドでの使用は何ですか?

しかし、なぜクラスメソッドを使用するのか(クラス外の)通常のメソッドとその使用方法は分かりません。例えば

#Why would you use: 
class Foo 
    def self.bar 
    puts "Class method" 
    end 
end 

#Versus simply: 
def bar 
    puts "Normal method" 
end 

Foo.bar # => Class method 
bar # => Normal method 

、どちらも同じ結果を生成すると? 私はそれらについてかなり混乱していますので、私はここで何か/すべてを誤解している場合は修正してください。あなたが言ったのと同じように

+0

基本的なOOPの本を読んでください。それはこの基本的な概念をもっと理解するのに役立ちます。 –

+0

@maximusあなたはどんなもの(または無料のオンラインのものをさらにお勧めしますか?)をお勧めしますか? – user2521439

+0

基本的なOOPの概念を学ぶには、o'reillyシリーズの書籍http://shop.oreilly.com/product/9780596008673.doを読んで、同じことをrubyで学ぶことをお勧めします。ルビーの本は最高ですhttp://www.sapphiresteel.com/ruby-programming/The-Book-Of-Ruby –

答えて

10

あなたの例は良いものではありません。

クラスメソッドはクラスのすべてのインスタンスを管理することができ、インスタンスメソッドは一度に1つのインスタンスを処理します。

class Book 
    def self.all_by_author(author) 
    # made up database call 
    database.find_all(:books, where: { author: author }).map do |book_data| 
     new book_data # Same as: Book.new(book_data) 
    end 
    end 

    def title 
    @title 
    end 
end 


books = Book.all_by_author('Jules Vern') 
books[0].title #=> 'Journey to the Center of the Earth' 

この例では、Bookという名前のクラスがあります。クラスメソッドall_by_authorを持っています。それはいくつかのふりをデータベースに照会し、Bookインスタンスの配列を返します。インスタンスメソッドtitleは、単一のBookインスタンスのタイトルをフェッチします。

したがって、インスタンスのコレクションを管理するclassメソッドとインスタンスメソッドは、そのインスタンスだけを管理します。この方法は、インスタンスのグループで動作するか、またはそのクラスに関連したコードであるが、直接単一のインスタンスを読み取りまたは更新しないならば一般的に


は、それはおそらく、クラスメソッドであるべきです。

3

、彼らは以下のとおりです。

  • は「同時に実行のみを持つことができます。」「クラスからではなく、オブジェクトからアクセスし、」

は、クラスが最も重要なことは、それはあなたのコードを整理し続けるということです

+1

これは、異なる機能ではなく組織的なものです。 – user2521439

+0

これは通常のメソッドとクラスメソッドの間にあります – user2521439

+0

@ user2521439はい、ちょうど編成です –

0

ポータブルであることも、覚えておいてください。何十万行ものコードがあると、それらをすべて同じ名前空間に無意識に投げ込むことは悪夢になります。組織は本当に重要であり、名前空間は言語のサポートを利用してモジュール性を得るための簡単な方法です。

クラス/モジュールメソッドは、その場所全体にリークすることなく状態を共有できます(クラスにはインスタンス変数を持たせることができます)。また、グローバルメソッドではファクタリングを改善するためのプライベートサポートメソッドを使用できます。効果的にプライベートにすることができます。

0

あなたは誤解の多くを持って、Rubyで

、私たちは、クラスとインスタンスメソッドを定義することができます。

クラス・メソッドは、クラス・レベルでの処理、つまりクラス・レベルでしか使用できないか、すべてのオブジェクトに関連するデータを提供するために使用されます。たとえば、クラスに属するオブジェクトの数を数えるには、クラスメソッドが必要です。同様に同様

Foo.count 

、あなたのような単一のオブジェクトを処理するために、オブジェクトのメソッドを必要とする単一のオブジェクトを処理するために、

obj.save 

ので、クラスメソッドは、オブジェクトが自身を持つことができますsingletoneデザインパターンの例であります同じ方法の実施。

+0

..... *どのようにwodod * –

+0

をRubyに追加するかは、オブジェクト内のメソッドを動的に追加/変更することができます。 obj.define_singleton_method(:new_method)のようにdo "do some things" end –

+0

オブジェクトから既存のメソッドを変更するには、ここのような簡単な割り当てで行うことができますhttp://stackoverflow.com/questions/9786495/dynamically-replace-method-ルビオブジェクトの実装 –

3

これはルビーよりもOOPの問題です。ルビのクラスメソッドは、他のオブジェクト指向プログラミング言語と同じように使用されます。これが意味:

  • クラスメソッドは、クラスのコンテキストで実行されている(そして唯一のクラス変数へのアクセス権を持っている)
  • インスタンスメソッドは、オブジェクトのコンテキストで実行(およびオブジェクトのか、インスタンス変数へのアクセス権を持っていますここでは)

より良い例です。

ここ
class Foo 
    def self.bar 
    puts 'class method' 
    end 

    def baz 
    puts 'instance method' 
    end 
end 

Foo.bar # => "class method" 
Foo.baz # => NoMethodError: undefined method ‘baz’ for Foo:Class 

Foo.new.baz # => instance method 
Foo.new.bar # => NoMethodError: undefined method ‘bar 

あなたはインスタンスメソッドを介してアクセスしている間に、そのクラスのメソッドは、クラスを介してアクセスされ見ることができますクラスのインスタンスまたはオブジェクト(Foo.new)。

例はhereからコピーされています。ここでは、この件に関する詳細情報も参照できます。

注意:コードはクラスまたはインスタンスメソッドに入れることができますが、それぞれの独自のユースケースと独自の賛否両論があります。 OOPでは、再利用可能で柔軟で読みやすいコードを目指しています。つまり、大部分のコードを、実用的なドメインモデルのインスタンスメソッドとして構造化して配置したいということです。

関連する問題