2011-12-16 23 views
6

Sto imparando Ruby e ROR allo stesso tempo e ho notato una cosa nel codice di qualcun altro. A volte vedo metodi che vengono definiti in questi due modi apparentemente leggermente diversi:C'è qualche differenza tra `def self.myMethod` e` def myMethod`?

class SomeClass < SomeInheritance::Base 

    def self.myMethod 
    end 

    def myOtherMethod 
    end 

end 

Fa qualche differenza? Voglio dire, l'uso di self in una definizione di metodo influisce sul modo in cui il metodo funziona in qualche modo? Qualsiasi illuminazione è la benvenuta.

+0

no, autonomo. lo rende un metodo di livello di classe mentre senza di sé, è un metodo di istanza. Quindi il 'sé'. uno può essere invocato come SomeClass.myMethod mentre l'altro avrebbe bisogno di un'istanza di SomeClass – aishwarya

+3

Ti consiglio di guardare http://scotland-on-rails.s3.amazonaws.com/2A04_DaveThomas-SOR.mp4 – cristian

+0

@ Octopus-Paul grazie per il link – marcio

risposta

20

def self.method_name definirà un metodo di classe piuttosto che un metodo di istanza - così come

class << self; def foo; end; end

Un buon post sul tema è this post da Yehuda Katz

ad esempio:

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

Quindi 'method_2' e' method_3' sono proprio come metodi statici? – marcio

+2

+1 bella risposta: un esempio vale 1000 parole di spiegazione. – wallyk

+1

@marcioAlmada - si comporta come un metodo statico. Foo è un oggetto (proprio come f), e method_2 è un metodo definito nella classe (meta) di Foo. Leggi il post collegato per una spiegazione migliore. – klochner

1

Se si prova questo codice:

class SomeClass 
    p self 
end 

si otterrà 'SomeClass' stampato. Questo perché self si riferisce all'oggetto SomeClass (sì, anche le clases sono oggetti in Ruby).

Con sé, è possibile definire un class_method, cioè un metodo sull'oggetto classe (anche se in realtà è definito nel metaclasse dell'oggetto ...):

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 

C'è molto di più da sapere su Rubino modello a oggetti. Dave Thomas ha tenuto un discorso eccellente su questo argomento - vedi il link @ Octopus-Paul raccomandato a te.

+0

sapeva già che 'self' era simile a' this' da altri linguaggi, ma non capiva che era usato per dichiarare i metodi di classe (equivalenti ai metodi statici in altre lingue). +1 – marcio

+0

@marcioAlmada 'self' cambia effettivamente il suo significato a seconda del contesto :) - una volta capito' self', allora capisci il modello dell'oggetto Ruby ... – maprihoda

Problemi correlati