Pytanie z ruby koans

pytanie z ruby koans brzmi nastepujaco:

THINK ABOUT IT:

The two major ways to write class methods are:

class Demo

def self.method

end

class << self

def class_methods

end

end

end

Which do you prefer and why?

Are there times you might prefer one over the other?

Zastanawialem sie nad tym i nie moge znalesc odpowiedzi. Moglby ktos to objasnic ?

1 Like

Druga metoda oszczędza trochę pisania jeśli masz sporo metod klasowych. Oraz skłania do ich ładnego pogrupowania (w pojedynczym bloku class << self). Patrz też kod źródłowy Rails :wink:

Jest też jeden rzecz, której nie zrobisz prosto w składni def self.method - uczynisz metodę chronioną lub prywatną. Wbrew pozorom:

class User protected def self.method end end
nie powoduje, że User.method jest chronione. Natomiast

class User class << self protected def method end end end
tak.

Jest jeszcze wersja z extend, ale ma sens tylko wtedy, gdy nie chcesz mieć żadnych metod instancyjnych:

module Foo
  extend self

  def bar
    'baz'
  end
end

Foo.bar # => 'baz'

Dobra odpowiedź jest tutaj: http://stackoverflow.com/a/2505077/1307676

Ostatnia część zawiera przykład z StateMachine, która korzysta class << self w metodach do zmiany metod tylko instancji a nie całe klasy.

To trochę zaawansowany wgląd do Ruby, ale pouczający.