2009-05-19 15 views
9

John Nunemaker recentemente blogged circa il various ways to define class methods in Ruby, dando a queste tre alternative:Come preferisci definire i metodi di classe in Ruby?

# Way 1 
class Foo 
    def self.bar 
    puts 'class method' 
    end 
end 

# Way 2 
class Foo 
    class << self 
    def bar 
     puts 'class method' 
    end 
    end 
end 

# Way 3 
class Foo; end 
def Foo.bar 
    puts 'class method' 
end 
  • Qual è il tuo modo preferito per fare questo?
  • Preferisci qualcosa di diverso da quelli sopra?
  • Se si utilizza più di un modo, in quali circostanze vengono utilizzati?

risposta

12

ho sempre il senso di 1:

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

non è prolisso, e mantiene il metodo nello stesso contesto della classe.

1

Preferisco il modo 1 in quanto non è sensibile al contesto. Non mi piace saltare nel mezzo di un file e quindi dover scorrere verso l'alto o verso il basso per vedere se il rientro significa che sono in un blocco class << self o se è solo un modulo nidificato.

0

Vedo < < per l'aggiunta di un metodo troppo insolito (sebbene io utilizzi felicemente < < con stringhe e IO).

Evito Foo.bar perché significa ripetersi.

1

D'accordo con la maggior parte degli utenti. Io tendo ad usare in primo luogo la

# Way 1 
class Foo 
    def self.bar 
    puts 'class method' 
    end 
end 

Ci sono alcune piccole differenze, se non ricordo male, che vengono visualizzati sul Pragmatic colloqui programmatori metaprogrammazione (che consiglio), che si riferiscono al modo in cui il codice della classe viene richiamato ed eseguito .

Erano piuttosto piccoli, anche se e per lo più cose che non dovremo affrontare su base normale. Vedrò se posso controllarli e pubblicarli.

0

Io uso la Via # 3, ma penso che anche Way # 1 sia fantastica. Dipende dal tuo utilizzo. Se vuoi che il tuo codice sia "tagliato/passibile" in altri moduli e classi, allora Way # 1 è migliore. Uso il modo # 3 per renderlo più doloroso da tagliare/incollare il codice, b/c Il mantra di Ruby è "non ripeterti" quindi non devi tagliare/incollare il codice molto spesso ..

3

Io generalmente preferisci def self.foo per i singoli metodi e class << self per lunghi tratti di metodi di classe. Sento che fa la distinzione tra la parte del metodo di classe e la parte del metodo di istanza della definizione di classe.

Problemi correlati