2011-12-16 13 views
6

私は同時にルビーとRORを学んでいて、他の誰かのコードで1つのことを気づいています。場合によっては、これらの2つの方法で定義されているメソッドがあることがあります。`def self.myMethod`と` def myMethod`の間に違いはありますか?

class SomeClass < SomeInheritance::Base 

    def self.myMethod 
    end 

    def myOtherMethod 
    end 

end 

違いがありますか?つまり、メソッド定義でselfを使用すると、メソッドが何とか動作する方法に影響しますか?どんな啓発も大歓迎です。

+0

nope、self。クラスレベルのメソッドにしますが、自己なしでは、インスタンスメソッドです。だから、「自己」。 SomeClass.myMethodとして呼び出すことができますが、もう一方はSomeClassのインスタンスを必要とします。 – aishwarya

+3

http://scotland-on-rails.s3.amazonaws.com/2A04_DaveThomas-SOR.mp4を参照することをお勧めします。 – cristian

+0

@ Octopus-Paulリンクのおかげで – marcio

答えて

20

​​は、インスタンスメソッドではなく、クラスのメソッドを定義する - ウィル

class << self; def foo; end; end

としてトピックに関する良いポストはカッツ

例えば

イェフダからthis postある:

class Foo 
    def method_1 
     "called from instance" 
    end 

    def self.method_2 
     "called from class" 
    end 

    class << self 
     def method_3 
     "also called from class" 
     end 
    end 
end 

> Foo.method_1 
NoMethodError: undefined method 'method_1' for Foo:Class 

> Foo.method_2 
=> "called from class" 

> Foo.method_3 
=> "also called from class" 

> f = Foo.new 
=> #<Foo:0x10dfe3a40> 

> f.method_1 
=> "called from instance" 

> f.method_2 
NoMethodError: undefined method 'method_2' for #<Foo:0x10dfe3a40> 

> f.method_3 
NoMethodError: undefined method 'method_3' for #<Foo:0x10dfe3a40> 
+0

したがって、 'method_2'と' method_3'は静的メソッドと同じですか? – marcio

+2

+1素敵な答え:例は1000語の説明に値する。 – wallyk

+1

@marcioAlmada - 静的メソッドのように動作します。 Fooはオブジェクト(fと同じ)、method_2はFoo(meta)クラスで定義されたメソッドです。より良い説明のために、リンク先の記事を読んでください。 – klochner

1

このコードを入力すると:

class SomeClass 
    p self 
end 

「SomeClass」が印刷されます。これは、selfがSomeClassオブジェクトを参照しているからです(はい、clasesもRubyのオブジェクトです)。自己付き

、あなたはclass_methodを定義することができ、すなわちクラスオブジェクト(それは実際にはオブジェクトのメタクラスで定義されていますが...)上のメソッド:

class SomeClass 
    def self.class_method 
    puts "I'm a class method" 
    end 

    def instance_method 
    puts "I'm an instance method" 
    end 
end 

SomeClass.class_method # I'm a class method 

は、Rubyを知ってはるかにありますオブジェクトモデル。 Dave Thomasはこのテーマについて優れた講演を行いました。@ Octopus-Paulのリンクをご覧ください。

+0

はすでに 'self'が他の言語の' this'と同じように知っていましたが、クラスメソッド(他の言語の静的メソッドと同等)を宣言するために使用されていることがわかりませんでした。 +1 – marcio

+0

@marcioAlmada 'self'はコンテキストに応じて実際にその意味を変えます:) - ' self'を理解すると、Rubyオブジェクトモデルを理解できます。 – maprihoda

関連する問題