Oto kolejny skuteczny sposób, aby sprawdzić, czy moduł został zawarte lub rozszerzony przez klasę.
Jak już wspomniano, można określić, czy moduł jest zawarty w klasie, sprawdzając metodę klasy included_modules
, która istnieje we wszystkich klasach ruby.
Więc jeśli miał klasę o nazwie MyClass
i chcesz sprawdzić, czy to zawarte moduł Comparable
mógłby zrobić coś takiego:
# will return true if MyClass.include(Comparable)
MyClass.included_modules.include?(Comparable)
Jeśli chcesz sprawdzić, czy dana klasa ma rozszerzony moduł ActiveRecord::Querying
, jak wszystkie klasy szyny modelu zrobić, rzeczywiście można to wykorzystać:
# will return true if MyClass.extend(ActiveRecord::Querying)
MyClass.kind_of?(ActiveRecord::Querying)
Dlaczego to działa? Cytując książkę Eloquent Ruby, by Russ Olsen:
Kiedy mieszać moduł do klasy, Ruby rewires hierarchii klas trochę, wkładając moduł jako rodzaj pseudo nadrzędnej klasy.
To oznacza również, że innym sposobem, aby określić, czy moduł został zawarte na swoją klasę jest zrobić coś takiego (choć nadal preferują metodę included_modules
):
# will also return true if MyClass.include(Comparable)
MyClass.new.kind_of?(Comparable)
jest gotowe sposób, że nazwie 'included_modules '. – Swanand
Tak jest. Dzięki za wskazówkę. –
Okazało się, że skoczyłem z pistoletu. Podniosłem pytanie z kilkoma dodatkowymi szczegółami. –