2011-12-16 2 views
6

Я изучаю рубин и ROR одновременно и заметил одно в чужом коде. Иногда я вижу методы, которые определяются этими двумя, по-видимому, несколько разными способами:Есть ли разница между `def self.myMethod` и` def myMethod`?

class SomeClass < SomeInheritance::Base 

    def self.myMethod 
    end 

    def myOtherMethod 
    end 

end 

В чем разница? Я имею в виду, что использование метода self в определении метода влияет на способ работы метода? Любое просвещение приветствуется.

+0

nope, self. делает его методом класса, тогда как без self - его метод экземпляра. Итак, «я». можно вызвать как SomeClass.myMethod, тогда как другому нужен экземпляр SomeClass – aishwarya

+3

Я рекомендую вам посмотреть http://scotland-on-rails.s3.amazonaws.com/2A04_DaveThomas-SOR.mp4 – cristian

+0

@ Octopus-Paul спасибо за ссылку – marcio

ответ

20

def self.method_name будет определять метод класса, а не метод экземпляра - в качестве воли

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), а метод_2 - метод, определенный в классе Foo (meta). Прочтите связанный пост для лучшего объяснения. – klochner

1

Если вы попробуете этот код:

class SomeClass 
    p self 
end 

вы получите напечатанную «SomeClass». Это связано с тем, что self ссылается на объект SomeClass (да, кланы тоже являются объектами в 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 

Там намного больше, чтобы знать о Рубине объектная модель. Дэйв Томас дал прекрасную беседу на эту тему - см. Ссылку @ Octopus-Paul, рекомендованную вам.

+0

уже знал, что 'self' был как' this' с других языков, просто не понял, что он использовался для объявления методов класса (что эквивалентно статическим методам на других языках). +1 – marcio

+0

@marcioAlmada 'self' фактически меняет свой смысл в зависимости от контекста :) - как только вы понимаете' self', тогда вы понимаете модель объекта Ruby ... – maprihoda

Смежные вопросы