foqq
September 14, 2011, 4:00pm
1
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
Tomash
September 14, 2011, 5:56pm
2
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
apohllo
September 14, 2011, 10:03pm
3
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.